V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
rwecho
V2EX  ›  Python

python sdk 问题

  •  
  •   rwecho · 2016-01-27 08:40:44 +08:00 · 3274 次点击
    这是一个创建于 3216 天前的主题,其中的信息可能已经有所发展或是发生改变。
    各位,请教个问题:

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

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

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

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

    @wmttom
    @janxin 我去搜一下猴子补丁, 不知道啥意思。
    @tempdban pr 是是什么?
    rwecho
        12
    rwecho  
    OP
       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
        13
    hcymk2  
       2016-01-27 10:53:49 +08:00
    wmttom
        14
    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
        15
    rwecho  
    OP
       2016-01-27 12:56:40 +08:00
    @wmttom 谢谢,我再找找学习下。
    rwecho
        16
    rwecho  
    OP
       2016-01-27 13:09:01 +08:00
    @wmttom 这种写法太奇妙了,这只有动态语言才会有这种扩展方式。
    latyas
        17
    latyas  
       2016-01-27 21:29:49 +08:00
    建议改动小 或者增加功能可以用 monkey patch
    否则改库 没什么的
    neoblackcap
        18
    neoblackcap  
       2016-01-28 01:27:16 +08:00
    其实我想说,能不能继承然后再 override?
    rwecho
        19
    rwecho  
    OP
       2016-01-28 08:24:23 +08:00
    @neoblackcap 那样也可以,但是改动比较多,例如 session 替换了 SessionEx,那我要把所有引用 Session 的全部替换掉,还是 monkey patch 优雅 ^_^

    我已经因为这个特性,被 python 给折服了,语言竟然可以这么灵活,不用一板一眼
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2669 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:37 · PVG 19:37 · LAX 03:37 · JFK 06:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.