Python 引用私有模块的问题

2020-11-27 14:46:32 +08:00
 JCZ2MkKb5S8ZX9pq

自有工具

优点

缺点

请问

2400 次点击
所在节点    Python
15 条回复
xiaojieluoff
2020-11-27 14:55:40 +08:00
这样一点都不 pythonic,Python 推荐的是按需导入,除非真的要因为导入的模块太多,可以合并到一个模块中。

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

from tools import subtool
no1xsyzy
2020-11-27 14:57:26 +08:00
1. 用自己的名字发布到 pypi,按标准的包管理方式管理,精确控制版本,还能顺便 open source license (划去
2. 做成 snippet 而不是引入
JCZ2MkKb5S8ZX9pq
2020-11-27 15:01:26 +08:00
@no1xsyzy

做成 snippet 有时候还是挺臃肿的,有些功能就是个小的类,也有个三十行上下。结果还是会变成在项目里嵌一个 toolbox 进去。
JCZ2MkKb5S8ZX9pq
2020-11-27 15:04:13 +08:00
@xiaojieluoff

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

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

就是想在这个基础上怎么再优化一下。
JCZ2MkKb5S8ZX9pq
2020-11-27 15:08:07 +08:00
@xiaojieluoff 另外也试过 from my_tool import a,b,c,d,e
结果一下子引用十几个…… 后来就偷懒直接 * 了
在便利和规范好维护之间纠结
no1xsyzy
2020-11-27 15:20:50 +08:00
@JCZ2MkKb5S8ZX9pq 我的意思是,你这个 toolbox 可以拆成多个 snippet
当然如果结构乱了还是整理下发 pypi,requirements 也就直接写 <my_name>_utils==1.2.3 了
JCZ2MkKb5S8ZX9pq
2020-11-27 15:23:37 +08:00
@no1xsyzy 发 pypi 倒是没试过,稍后我去看看怎么搞的。
CzaOrz
2020-11-27 17:56:00 +08:00
我也有一个类似的工具包,大而杂,到最后光加载这一个工具包就会明显卡顿。。。(包含 Scrapy 、Selenium 、Log 、Django 、Tarnado...)
所以还是拆开吧,可以把自己喜欢的上传到 pypi~
CzaOrz
2020-11-27 17:56:36 +08:00
log 输出颜色
json 格式化打印
JCZ2MkKb5S8ZX9pq
2020-11-27 19:09:43 +08:00
@CzaOrz 你这个听上去就很大,我的还没那么重。
基本即使些经常用到的 os/sys/time/json 这类的小东西,基本每个文件都会用到。
有些比如 pandas/PIL/numpy 我也是单独都拆出来了,并不是每个文件都会用到。

另外有些项目基本成型了固定了,我也就单独把用到的都拆包放个备份了。
就是写一半的,和有些小玩意儿,随后写随手引用,但日后再调发现跑不通了。
imn1
2020-11-27 19:10:02 +08:00
前置,不要扔到一个 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
2020-11-27 19:14:18 +08:00
os 之类的模块不应该这么引入。

想分版本可以发到 pypi
bbbb
2020-11-28 21:57:35 +08:00
关注,学习一下
abersheeran
2020-11-29 10:49:51 +08:00
import * 记得要写 __all__

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

真想版本控制,那就推到 pypi 上。
luxiaoer
2020-12-01 12:27:51 +08:00
每个做项目遇到的问题吧。
个人看法
单独 git
把功能都继承到自定义的基础类里面去,类初始化的时候传入版本号,版本号默认一个值
功能函数 类中判断功能函数实现向下兼容
对于重构的功能就直接继承后重新写好了
类似 sdk 的写法

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

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

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

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

© 2021 V2EX