|  |      1ipwx      2024-10-10 18:18:17 +08:00 因为好的库不用这个,反而 Annotation 用的多。 | 
|      2justdoit123 OP 麻蛋,看这种代码感觉自己是在 剥洋葱/捉迷藏。 十年前的 coder 说:“大王,来抓我呀~ ” “我在这,来抓我呀~”。 | 
|  |      3summerwar      2024-10-10 18:23:21 +08:00  1 基础性的方法不限制传入的参数的数量和种类,可以更方便的处理各种数据,十分灵活。如果你要限定传入的参数和内容,那么可以在基础方法的基础上再定义函数和具体化参数。 *args 表示传入的是列表或元祖,*kwargs 传递的是字典,记住这两条就问题不大了,按照这个规则将获取到的参数放入自己的方法里,不在自己方法里的参数直接丢掉就好了。 | 
|      4mark2025      2024-10-10 18:33:04 +08:00 动态一时爽,维护 xxx 。 动态还是 TS 最爽,兼顾 js 的灵活以及类型保护 | 
|      5shylockhg      2024-10-10 18:43:17 +08:00 这玩意我只记得以前弄懂过一次,现在又忘完了 | 
|  |      6iorilu      2024-10-10 18:55:11 +08:00 python 确实很多地方用这个, 其实主要就是为了兼容未来可能增加得参数, 这样以后 随便传啥, 反正接口不用改 | 
|  |      7ounxnpz      2024-10-10 19:03:16 +08:00 如果你想写个通用一点的装饰器,没这两个还真的不方便。这两个参数用于传递很好用,不要滥用就好 | 
|  |      8yohole      2024-10-10 19:20:48 +08:00  2 这是 javaer 学 python 最难受的一点 | 
|  |      9git00ll      2024-10-10 19:25:31 +08:00 是的很难受,特别是调用第三方接口时,压根不知道往里面传什么 | 
|  |      10iorilu      2024-10-10 20:03:09 +08:00 | 
|      11Binwalker      2024-10-10 20:05:02 +08:00 ruby 里面也有,而且比这个还自由 | 
|      12fatigue      2024-10-10 20:11:42 +08:00  1 工程设计的锅东西别让语言特性来背 | 
|      13Jinnrry      2024-10-10 20:13:54 +08:00  5 和语言没啥关系,和人有关系。 难道 php 就不能一个 array 满天飞了吗? 难道 java 就不能一个 Object 满天飞了吗? 难道 golang 就不能一个 any 满天飞了吗? 不过有一说一,接手 python 代码我是最害怕的,1 个项目 10 个人有 100 种写法,每次都能学到新姿势。python 天天喊着“人生苦短”,就这 100 种写法,看下来确实人生苦短了 | 
|      14TimG      2024-10-10 20:36:17 +08:00 via Android @Jinnrry 不能这么说,还是跟语言有关系的,python 显然有支持这种行为的意图,现在都成为一种标准了。Java 要是装箱不用拆我也用,但它是强类型,不光写一堆拆箱还要折算性能损耗,合计下来就很不经济。 | 
|  |      15AV1      2024-10-10 20:53:55 +08:00 有类型标注还好,如果没类型标注,维护 python 就是痛苦的折磨 | 
|      1614      2024-10-10 21:06:23 +08:00 同感,我最近喜欢 def func(*, a, b=2, c) 这样定义,这样调用的时候必须 func(a=1, c=3) 强制写清楚参数名字,并且 abc 可以在任意位置写默认值 | 
|  |      17buf1024      2024-10-10 21:10:19 +08:00  2 防御性编程,值得点赞。 | 
|  |      18ClericPy      2024-10-10 21:17:39 +08:00 老代码让我用 type-hints 给包了一层 interface 。。。 不敢动底层啊,上次动了,加班到晚上 9 点多! | 
|  |      19est      2024-10-10 21:34:29 +08:00 数据拷贝任务你换啥语言来都是 dirty work | 
|  |      20bhy      2024-10-10 21:40:43 +08:00 可以试试看 pytype 能不能 infer kwargs 的类型。看了一圈,mypy 和 pyright 应该还不支持。 | 
|  |      21miaotaizi      2024-10-10 21:49:58 +08:00 "屎中一坨",  别说什么 “人生苦短”, 不接受反驳 | 
|      22NoOneNoBody      2024-10-10 21:57:13 +08:00 params = ((1,2,3), (4,5,6,7), ...) result = 0 for i,fun in enumerate((fun1, fun2, fun3, ...)): result=fun(result, *params[i]) print(result) 有些时候,上述 1,2,3 或 4,5,6,7 这些参数就是从上游得到的结果,只需按需顺列好传到下游计算,不需要理会其具体意义,这时候,args 就很有用了 例如上述代码写成闭包,只需传 params 和 result 初始值,就能完成一长串的计算,不需要记太多参数意义,可能更重要的点是 fun1/fun2/fun3...的顺序 数据预处理、标准化经常就是这样枯燥的,步骤和参数固定,机械化按顺序执行就是了 爬虫也是,无非就是 bs4+selector ,re+pattern ,lxml+xpath ,函数形式基本固定,变化只是 selector/pattern/xpath 这些,bs4/re/lxml 谁先谁后可能更重要 其实还有其他用法,如参数“补齐” 有十个参数,参数名都是固定的,有若干个 fun 都用这些同名参数,fun1 只用到 3 个,fun2 只用到 7 个……,可以全部十个都用 kwargs 传进去,传多了也不会错,不用逐个 fun 检查并选择哪些参数。例如处理图片,很多函数都是用相同的参数名,其意义也固定的,什么宽高、通道数……如果已知足够多参数,一起用 kwargs 传过去也不会错的,除非这个用 w/h 表示宽高,那个用 width/height 表示宽高,这就麻烦了 | 
|  |      23miaotaizi      2024-10-10 22:00:07 +08:00 @NoOneNoBody 为什么不把你的 10 个参数 做成一个对象? | 
|  |      24300      2024-10-10 22:04:07 +08:00 更难受的是查找调用,结果弹出几十个无关路径,仅仅因为名字一样== | 
|      25NoOneNoBody      2024-10-10 22:05:59 +08:00 @miaotaizi #23  也可以啊,dataclass 就是这个用途吧,只是我没参透 def fun1(width, height): ... def fun2(a, width,height): ... params = {'width': 1920, 'height':1080} fun1(**params) a = 123 fun2(a, **params) | 
|  |      26R4rvZ6agNVWr56V0      2024-10-10 22:42:31 +08:00 语法糖能取代 BOB 大爷的设计模式吗    LMAO  至今为止尚未有语言可以做到吧。所以也别吐槽灵活性设计了。 | 
|      27justdoit123 OP 没有攻击语言的意思。 估计这也是工程演进的产物。 也不是只是单纯的吐槽。 真的建议不要乱用语言特性。 | 
|  |      28F281M6Dh8DXpD1g2      2024-10-10 22:57:33 +08:00 你都用 python 了还纠结这些 | 
|      29genesislive      2024-10-10 23:20:43 +08:00 matplotlib 里面应该有不少 | 
|  |      30mywaiting      2024-10-10 23:23:59 +08:00 别人写的 *args **kwargs 什么垃圾,类型标识都没有,简直屎山! python 垃圾语言! 自己一把梭 *args **kwargs 内部各种对 kwargs 一会 pop 一会 setdefault 真香!干净简洁优雅! python 牛逼! | 
|  |      31adoal      2024-10-10 23:26:12 +08:00  1 用来做透传很方便 | 
|      32Vonrix      2024-10-11 07:20:48 +08:00 每次用完就忘 | 
|  |      33G64q9J89mN5KSgmE      2024-10-11 08:17:29 +08:00 许多第三方包特别喜欢用这两玩意 调用还得看一大堆文档,操 | 
|  |      34ytmsdy      2024-10-11 08:49:59 +08:00 @Jinnrry 哈哈哈哈,确实,Python 里面的花式语法确实是最多的!就算 Python 的老司机,看到有些花式语法也要愣一下。 | 
|      35CodeCodeStudy      2024-10-11 09:23:01 +08:00 @Jinnrry #13 golang 没有 any ,那是 typescript ,golang 的是 interface{} | 
|  |      36InkStone      2024-10-11 09:34:41 +08:00 也没啥好吐槽的,所有现存的静态类型语言都有相同的机制,更不要说动态类型的了。 C 里有 void*满天飞的代码,Java 也有很多人喜欢传 Map ,Golang interface{} 一把梭,Typescript 可以用 any 退化成多写几个字母的 javascript…… | 
|      37qq135449773      2024-10-11 09:48:02 +08:00 这东西只能说仁者见仁智者见智了,IDE 静态分析足够强的话感觉问题还不算大 | 
|  |      38qW7bo2FbzbC0      2024-10-11 10:25:09 +08:00 @CodeCodeStudy 新版本里面针对泛型类型指定,的确是 any 更符合语义,interface{}是 1.8 之前的用法了 | 
|      39lolizeppelin      2024-10-11 11:14:04 +08:00 不能喷公司垃圾代码  转头喷 python 提供的功能 2333 | 
|      40lolizeppelin      2024-10-11 11:19:36 +08:00 | 
|  |      41vialon17      2024-10-11 11:34:21 +08:00 滥用想想都脑壳大,没有类型注释不麻烦吗? | 
|      42uni      2024-10-11 11:39:24 +08:00 直接在 linter 里面禁用这些东西 每次跟别人合作 py 代码我都会要求他们把 vscode 的 py 类型检查(默认是关闭的)打开,他们可以不改但是编辑器报满屏都是红色的他们要能看到 | 
|  |      43chashao      2024-10-11 12:28:18 +08:00 | 
|  |      44ipwx      2024-10-11 15:16:43 +08:00 @lolizeppelin 啊哈哈哈,大概是因为我喜欢在没人回复的帖子下面先回复,如果有很多回复的帖子我反而不会回复也不会看回复吧。所以你经常在前几楼看见我,其实我水的不多。 | 
|  |      45lyxxxh2      2024-10-11 16:27:57 +08:00 ``` def init_tracker(self, *args): self.tracker = CashTracker(*args) return self ``` 参数多了,挺方便啊。 | 
|  |      46Rehtt      2024-10-12 08:47:07 +08:00 via Android @CodeCodeStudy 1.18 以后就有了 // any is an alias for interface{} and is equivalent to interface{} in all ways. type any = interface{} | 
|      47CodeCodeStudy      2024-10-12 09:46:10 +08:00 | 
|  |      49qq78660651      2024-10-17 10:42:49 +08:00 写 python 就算是自己维护,不写注释,2 周后我都不知道里面我写的啥。 |