各位,请教个问题:
python 中引入的 sdk 包,如果功能有限,或者包里面的函数有问题,我是需要直接改包里面的.py 文件?
还是在自己项目里面写个扩展呢?
第一种如果换台机器那岂不是要再改一次?
第二种要改的地方太多了
python 中引入的 sdk 包,如果功能有限,或者包里面的函数有问题,我是需要直接改包里面的.py 文件?
还是在自己项目里面写个扩展呢?
第一种如果换台机器那岂不是要再改一次?
第二种要改的地方太多了
1
billgreen1 Jan 27, 2016
或者你基于 sdk ,添加点东西,然后放到 pypi 上?
|
2
rwecho OP @billgreen1 那不行吧, 那不是别人的包吗? 如果是 C#(我本身是做.net 开发的)我可以把 dll 包含进来,然后在做修改,或者把源代码包含到项目中,再做修改,这样我就能修改我想要的功能,等发布的时候,它也被打包进最终的 exe 或 dll
|
3
strahe Jan 27, 2016
别人的东西最好不要动,如果觉得有问题就自己写吧,因为毕竟要多台机器 pip install
|
5
tempdban Jan 27, 2016 via Android
看准协议 能改就改啊
|
7
wmttom Jan 27, 2016
使用前 monkey_patch 一下就好了。
|
8
Karblue Jan 27, 2016
用第一种方法。 把改完后的 sdk 拷贝到和项目同级目录下.就不会 import site-package 里面的包了. 这样发布出去都能用了
|
9
janxin Jan 27, 2016
猴子补丁一下
|
11
rwecho OP |
12
rwecho OP @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 文件,但是我觉得这对以后迁移到正式环境会有影响,所以才提出这个问题。 如果用猴子补丁,这种方式,我该怎么做? |
13
hcymk2 Jan 27, 2016
|
14
wmttom Jan 27, 2016
@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 ,可以参考下。 |
17
latyas Jan 27, 2016
建议改动小 或者增加功能可以用 monkey patch
否则改库 没什么的 |
18
neoblackcap Jan 28, 2016
其实我想说,能不能继承然后再 override?
|
19
rwecho OP @neoblackcap 那样也可以,但是改动比较多,例如 session 替换了 SessionEx,那我要把所有引用 Session 的全部替换掉,还是 monkey patch 优雅 ^_^
我已经因为这个特性,被 python 给折服了,语言竟然可以这么灵活,不用一板一眼 |