跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • Python 引用私有模块的问题
未分類
30 11 月 2020

Python 引用私有模块的问题

Python 引用私有模块的问题

資深大佬 : JCZ2MkKb5S8ZX9pq 1

自有工具

  • 有一些常用的命令和函数,做成了文件,比如 my_toolbox.py。实现的都是一些常用功能,比如

    • 各种时间格式相互转换
    • log 输出颜色
    • json 格式化打印
    • 系统语音、通知
    • 打印带框标题
    • 计时(含间隔)、计数
    • request 含重试和返回校验等
    • 总之就是一些常用函数和类,但是代码又有点长,不高兴每次都复制黏贴一遍的内容。
  • 平时调用就是 from my_tool import *。有些常用的导入也在这里面了,比如 os 、sys 、json 、re 等等。

  • 其它嘛还有一些使用频度低的,就单独拆开了,比如 excel 整理排错格式化后丢出 json,或者 df 通过 win32com 生成 excel 文件之类的。

优点

  • 平时写点小东西比较快速,不用一个个去 import,或者复制代码。
  • 发现工具 bug 了,也可以统一修改,不用各处都去改动。

缺点

  • 由于陆续地修改调整,可能部分函数没有向下兼容。
  • 这个文件单独在外面,做 git 或者备份的时候,并不在项目内。

请问

  • 所以考虑要不要分一下版本,然后项目引用的时候标注下版本。有点像写 requirements,标注依赖版本。或者每个项目里都把依赖的私有工具都复制一份进去。

  • 如果是要分版本的话,实践中怎么处理比较好,想听听看大家的做法。

大佬有話說 (14)

  • 資深大佬 : xiaojieluoff

    这样一点都不 pythonic,Python 推荐的是按需导入,除非真的要因为导入的模块太多,可以合并到一个模块中。

    我觉得可以把 my_tool 模块整理下,规范命名,这样就可以在使用的时候按需导入,也能提高下代码的可读性。

    from tools import subtool

  • 資深大佬 : no1xsyzy

    1. 用自己的名字发布到 pypi,按标准的包管理方式管理,精确控制版本,还能顺便 open source license (划去
    2. 做成 snippet 而不是引入

  • 主 資深大佬 : JCZ2MkKb5S8ZX9pq

    @no1xsyzy

    做成 snippet 有时候还是挺臃肿的,有些功能就是个小的类,也有个三十行上下。结果还是会变成在项目里嵌一个 toolbox 进去。

  • 主 資深大佬 : JCZ2MkKb5S8ZX9pq

    @xiaojieluoff

    其实已经一点点精简过了,剩下的都是比较常用的,不常用的的确都单独 from util.sub_tool import func_name 。

    但写小东西多,共享的一般还是都老老实实一个个导入通用的模块,然后单独复制一段代码。自己用的话就图快图方便了。

    就是想在这个基础上怎么再优化一下。

  • 主 資深大佬 : JCZ2MkKb5S8ZX9pq

    @xiaojieluoff 另外也试过 from my_tool import a,b,c,d,e
    结果一下子引用十几个…… 后来就偷懒直接 * 了
    在便利和规范好维护之间纠结

  • 資深大佬 : no1xsyzy

    @JCZ2MkKb5S8ZX9pq 我的意思是,你这个 toolbox 可以拆成多个 snippet
    当然如果结构乱了还是整理下发 pypi,requirements 也就直接写 <my_name>_utils==1.2.3 了

  • 主 資深大佬 : JCZ2MkKb5S8ZX9pq

    @no1xsyzy 发 pypi 倒是没试过,稍后我去看看怎么搞的。

  • 資深大佬 : CzaOrz

    我也有一个类似的工具包,大而杂,到最后光加载这一个工具包就会明显卡顿。。。(包含 Scrapy 、Selenium 、Log 、Django 、Tarnado…)
    所以还是拆开吧,可以把自己喜欢的上传到 pypi~

  • 資深大佬 : CzaOrz

    log 输出颜色
    json 格式化打印

  • 主 資深大佬 : JCZ2MkKb5S8ZX9pq

    @CzaOrz 你这个听上去就很大,我的还没那么重。
    基本即使些经常用到的 os/sys/time/json 这类的小东西,基本每个文件都会用到。
    有些比如 pandas/PIL/numpy 我也是单独都拆出来了,并不是每个文件都会用到。

    另外有些项目基本成型了固定了,我也就单独把用到的都拆包放个备份了。
    就是写一半的,和有些小玩意儿,随后写随手引用,但日后再调发现跑不通了。

  • 資深大佬 : imn1

    前置,不要扔到一个 py 里面,最好不同功能、不同 import 分开,放在一个目录(可以有子目录)

    你了解一下 .pth 文件,放到 site-packages,指向上述这个目录就行,然后就可以当三方包用了
    至于打包,或编译,另外再处理就是了,只是路径问题

    向下兼容嘛,如果是放到 site-packages,自然就能做到不同 version 指向不同目录

    我自己有几十个 py,里面过半是闭包或装饰器,自制语法糖等等,就是预定一些格式,不用每次写都加一段格式转换的代码,例如要处理日文,我就预设 shift-jis,不用每个 encode/decode (还有其他函数)都要带上 encoding=sjis 参数了
    又例如自制表达式:
    lst = LIST(a) – b, 相当于 lst: list = [x for x in list(a) if x not in b]
    s = STR(a) – b 相当于 s: str = str(a).replace(b, ”)

  • 資深大佬 : Trim21

    os 之类的模块不应该这么引入。

    想分版本可以发到 pypi

  • 資深大佬 : bbbb

    关注,学习一下

  • 資深大佬 : abersheeran

    import * 记得要写 __all__

    个人觉得,最好还是按需复制粘贴好一点。你不能保证你的每个功能都是能适应任何场景的,复制粘贴就可以按需修改。

    真想版本控制,那就推到 pypi 上。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具