python sdk 问题

2016-01-27 08:40:44 +08:00
 rwecho
各位,请教个问题:

python 中引入的 sdk 包,如果功能有限,或者包里面的函数有问题,我是需要直接改包里面的.py 文件?
还是在自己项目里面写个扩展呢?

第一种如果换台机器那岂不是要再改一次?
第二种要改的地方太多了
3266 次点击
所在节点    Python
19 条回复
billgreen1
2016-01-27 08:59:32 +08:00
或者你基于 sdk ,添加点东西,然后放到 pypi 上?
rwecho
2016-01-27 09:12:48 +08:00
@billgreen1 那不行吧, 那不是别人的包吗? 如果是 C#(我本身是做.net 开发的)我可以把 dll 包含进来,然后在做修改,或者把源代码包含到项目中,再做修改,这样我就能修改我想要的功能,等发布的时候,它也被打包进最终的 exe 或 dll
strahe
2016-01-27 09:27:15 +08:00
别人的东西最好不要动,如果觉得有问题就自己写吧,因为毕竟要多台机器 pip install
rwecho
2016-01-27 09:48:35 +08:00
@strahe
那它这个包我是用还是不用呢?是不是把它所有文件都拷贝到我的项目下?还是用到哪,改到哪?
tempdban
2016-01-27 10:05:30 +08:00
看准协议 能改就改啊
rwecho
2016-01-27 10:07:09 +08:00
@tempdban

确实要改, 我说的是把他所有文件复制到我的工作目录下改吗?

就是想问问你们都怎么做的?
wmttom
2016-01-27 10:08:45 +08:00
使用前 monkey_patch 一下就好了。
Karblue
2016-01-27 10:10:04 +08:00
用第一种方法。 把改完后的 sdk 拷贝到和项目同级目录下.就不会 import site-package 里面的包了. 这样发布出去都能用了
janxin
2016-01-27 10:11:48 +08:00
猴子补丁一下
tempdban
2016-01-27 10:23:28 +08:00
@rwecho 我一般是提 pr
rwecho
2016-01-27 10:38:25 +08:00
@Karblue 好的,这样我感觉合适,不影响全局的包,只是发布文件大了点。

@wmttom
@janxin 我去搜一下猴子补丁, 不知道啥意思。
@tempdban pr 是是什么?
rwecho
2016-01-27 10:47:12 +08:00
@janxin
@wmttom

好像猴子补丁就是针对这种情况的,但是我还是不清楚具体使用方法,能不能具体赐教下。

具体情况是这样的,我在调用 onedrivesdk 库, 而这个库里面有个 session.py 最后一个函数 load_session 中需要增加 @staticmethod 标识。

https://github.com/OneDrive/onedrive-sdk-python/issues/17


我现在已经手动改了{python_install_dir}\Lib\site-packages\onedrivesdk\session.py 文件,但是我觉得这对以后迁移到正式环境会有影响,所以才提出这个问题。

如果用猴子补丁,这种方式,我该怎么做?
hcymk2
2016-01-27 10:53:49 +08:00
wmttom
2016-01-27 11:53:16 +08:00
@rwecho 比如先有个
class A(object):pass
想动态给 A 添加静态方法 load_session

```python
import A
def load_session(**load_session_kwargs): print(load_session_kwargs)
A.load_session = staticmethod(load_session)
```
类似逻辑放到一个函数里,一般会起名叫 monkey_patch_xxx
因为 python import 过的包就不会再 import ,所以把这个函数放到代码的入口处执行,之后相同的 import 实际用的也是你 patch 过的。
gevent 里面有很多 patch ,可以参考下。
rwecho
2016-01-27 12:56:40 +08:00
@wmttom 谢谢,我再找找学习下。
rwecho
2016-01-27 13:09:01 +08:00
@wmttom 这种写法太奇妙了,这只有动态语言才会有这种扩展方式。
latyas
2016-01-27 21:29:49 +08:00
建议改动小 或者增加功能可以用 monkey patch
否则改库 没什么的
neoblackcap
2016-01-28 01:27:16 +08:00
其实我想说,能不能继承然后再 override?
rwecho
2016-01-28 08:24:23 +08:00
@neoblackcap 那样也可以,但是改动比较多,例如 session 替换了 SessionEx,那我要把所有引用 Session 的全部替换掉,还是 monkey patch 优雅 ^_^

我已经因为这个特性,被 python 给折服了,语言竟然可以这么灵活,不用一板一眼

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/253621

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX