吐槽 Python 的 *args, **kwargs

112 天前
 justdoit123
接手一个数据拷贝的任务,在老代码里看到大量 def xxx_fn(*args, **kwargs) 真的血压升高。

这两兄弟里面“什么都有,又什么都没有“,反正全靠猜。

没有注释,就算有注释,随时时间迁移也未必准确。

从最外层到最内层,每一层都有可能往 kwargs 里塞参数或者 pop 参数。

这样的代码心智负担大,理解起来效率低。

这种写法一点也不酷,真的要慎重是用。另外要吐槽,python 社区还有大量这种库(包括官方自带的库),不过幸好质量好一点库都有参数注释,而且(应该是)有持续维护。


我也在思考,为什么各类语言要有那么多酷炫无比的特性?我认为,这些特性大部分是为基础库服务的。上层逻辑代码乱用这种特性,只会给自己找麻烦。


一下省略 “*args, **kwargs“ 个字
4099 次点击
所在节点    Python
49 条回复
ipwx
112 天前
因为好的库不用这个,反而 Annotation 用的多。
justdoit123
112 天前
麻蛋,看这种代码感觉自己是在 剥洋葱/捉迷藏。

十年前的 coder 说:“大王,来抓我呀~ ” “我在这,来抓我呀~”。
summerwar
112 天前
基础性的方法不限制传入的参数的数量和种类,可以更方便的处理各种数据,十分灵活。如果你要限定传入的参数和内容,那么可以在基础方法的基础上再定义函数和具体化参数。

*args 表示传入的是列表或元祖,*kwargs 传递的是字典,记住这两条就问题不大了,按照这个规则将获取到的参数放入自己的方法里,不在自己方法里的参数直接丢掉就好了。
mark2025
112 天前
动态一时爽,维护 xxx 。 动态还是 TS 最爽,兼顾 js 的灵活以及类型保护
shylockhg
112 天前
这玩意我只记得以前弄懂过一次,现在又忘完了
iorilu
112 天前
python 确实很多地方用这个, 其实主要就是为了兼容未来可能增加得参数, 这样以后
随便传啥, 反正接口不用改
ounxnpz
112 天前
如果你想写个通用一点的装饰器,没这两个还真的不方便。这两个参数用于传递很好用,不要滥用就好
yohole
112 天前
这是 javaer 学 python 最难受的一点
git00ll
112 天前
是的很难受,特别是调用第三方接口时,压根不知道往里面传什么
iorilu
112 天前
@ounxnpz 是的, 装饰器必须用这个兼容所有接口得

所以说, python 很多所谓技巧, 其实不是技巧, 而是刚需

你可以不用, 但你必须知道
Binwalker
112 天前
ruby 里面也有,而且比这个还自由
fatigue
112 天前
工程设计的锅东西别让语言特性来背
Jinnrry
112 天前
和语言没啥关系,和人有关系。
难道 php 就不能一个 array 满天飞了吗?
难道 java 就不能一个 Object 满天飞了吗?
难道 golang 就不能一个 any 满天飞了吗?


不过有一说一,接手 python 代码我是最害怕的,1 个项目 10 个人有 100 种写法,每次都能学到新姿势。python 天天喊着“人生苦短”,就这 100 种写法,看下来确实人生苦短了
TimG
112 天前
@Jinnrry 不能这么说,还是跟语言有关系的,python 显然有支持这种行为的意图,现在都成为一种标准了。Java 要是装箱不用拆我也用,但它是强类型,不光写一堆拆箱还要折算性能损耗,合计下来就很不经济。
DOLLOR
112 天前
有类型标注还好,如果没类型标注,维护 python 就是痛苦的折磨
14
112 天前
同感,我最近喜欢 def func(*, a, b=2, c) 这样定义,这样调用的时候必须 func(a=1, c=3) 强制写清楚参数名字,并且 abc 可以在任意位置写默认值
buf1024
112 天前
防御性编程,值得点赞。
ClericPy
112 天前
老代码让我用 type-hints 给包了一层 interface 。。。

不敢动底层啊,上次动了,加班到晚上 9 点多!
est
112 天前
数据拷贝任务你换啥语言来都是 dirty work
bhy
112 天前
可以试试看 pytype 能不能 infer kwargs 的类型。看了一圈,mypy 和 pyright 应该还不支持。

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

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

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

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

© 2021 V2EX