吐槽 Python 的 *args, **kwargs

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

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

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

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

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

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


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


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

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

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

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

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


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

不敢动底层啊,上次动了,加班到晚上 9 点多!
est
4 天前
数据拷贝任务你换啥语言来都是 dirty work
bhy
4 天前
可以试试看 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