python sdk 问题 - V2EX
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 3714 次点击
    这是一个创建于 3612 天前的主题,其中的信息可能已经有所发展或是发生改变。
    各位,请教个问题:

    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     Solana     5616 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 02:37 PVG 10:37 LAX 18:37 JFK 21:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86