文无第一,武无第二,大城小胖说的 python 这段代码怎么优化

2016-01-28 10:35:45 +08:00
 jpmorn


我今天白天说得就是这个... 所以, 年轻人千万别轻易的拜大神。那些满口软件工程、重构、敏捷开发、 OOP 、 TDD 、高质量、可复用……的人啊,写起代码来说不定有多魔幻呢…


/@老赵:无论如何也应该把 cmd 提取出来,然后每个 if 分支执行后就跳过,现在先不论代码漂不漂亮,每个 if 条件都判断一遍是几个意思,至少也 elif 一下呢? //@欧长坤:[doge]谁能讨论点儿正经的 这玩意儿到底应该怎么写?

//@GeniusVczh:我仔细地看了一眼这个代码,发现很有规律啊,正确的做法是写个独立程序 parse 这个文件,然后 codegen 出这一段函数来,除此以外没有任何更好的办法。

.
轮子哥说的这个是啥,有没有库之类的
4133 次点击
所在节点    问与答
27 条回复
caomaocao
2016-01-28 13:39:23 +08:00
要用 dict 来表示 switch 呀~ python 里
sherlocktheplant
2016-01-28 13:40:25 +08:00
直接设计类的时候 cmd 和函数名一一对应就好了啊 参数用** kwargs 传就好了
icedx
2016-01-28 14:05:50 +08:00
有低级错误 另外不要轻易用 duct 代替 swirch
icedx
2016-01-28 14:05:59 +08:00
Switch
felinx
2016-01-28 14:19:16 +08:00
根据 cmd 的字符和名字规则用 getattr 自动获取函数名,代码可以简练的多。且看命名习惯,这不是一个熟练的 Python 工程师写的,一点不 Pythonic 。
gamexg
2016-01-28 14:36:32 +08:00
data 这个变量名被多次重复使用没人提吗?之后修改逻辑时很有可能掉坑里。

其他的看起来都是小问题。

反射搞不定,参数不一致。
hepochen
2016-01-28 15:45:29 +08:00
像这种规则性非常明确的,也不需要用到额外的 dict 来建立映射。

替换这进百行的重复代码,基本思路大抵如此:
handler = getattr(self, data_item.get('cmd', '')+'_handler', None)
if handler:
handler(*[data_item.get(key) for key in inspect.getargspec(handler).args])


写出脏代码并不可耻,为脏代码辩解的倒真算是可耻的。

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

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

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

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

© 2021 V2EX