吐槽 Python 的 *args, **kwargs

justdoit123 · 2024-10-10 18:14:44 · 345 次点击
接手一个数据拷贝的任务,在老代码里看到大量 def xxx_fn(*args, **kwargs) 真的血压升高。

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

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

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

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

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


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


一下省略 “*args, **kwargs“ 个字
举报· 345 次点击
登录 注册 站外分享
25 条回复  
ipwx 小成 2024-10-10 18:18:17
因为好的库不用这个,反而 Annotation 用的多。
summerwar 小成 2024-10-10 18:23:21
基础性的方法不限制传入的参数的数量和种类,可以更方便的处理各种数据,十分灵活。如果你要限定传入的参数和内容,那么可以在基础方法的基础上再定义函数和具体化参数。

*args 表示传入的是列表或元祖,*kwargs 传递的是字典,记住这两条就问题不大了,按照这个规则将获取到的参数放入自己的方法里,不在自己方法里的参数直接丢掉就好了。
mark2025 小成 2024-10-10 18:33:04
动态一时爽,维护 xxx 。 动态还是 TS 最爽,兼顾 js 的灵活以及类型保护
shylockhg 小成 2024-10-10 18:43:17
这玩意我只记得以前弄懂过一次,现在又忘完了
iorilu 小成 2024-10-10 18:55:11
python 确实很多地方用这个, 其实主要就是为了兼容未来可能增加得参数, 这样以后
随便传啥, 反正接口不用改
ounxnpz 小成 2024-10-10 19:03:16
如果你想写个通用一点的装饰器,没这两个还真的不方便。这两个参数用于传递很好用,不要滥用就好
yohole 小成 2024-10-10 19:20:48
这是 javaer 学 python 最难受的一点
git00ll 初学 2024-10-10 19:25:31
是的很难受,特别是调用第三方接口时,压根不知道往里面传什么
Binwalker 小成 2024-10-10 20:05:02
ruby 里面也有,而且比这个还自由
123下一页
返回顶部