1
ming2281 2016-01-28 10:49:54 +08:00 via Android
黑点是啥,没有看懂
|
3
function007 2016-01-28 11:05:11 +08:00
不知道 python 里有没有 switch ,找到之后可以 break 出去的
话说照首字母分个类,第一步判断首字母的话,说不定能省不少工作量? |
4
awanabe 2016-01-28 11:06:21 +08:00
py2 是没有 switch 的...只有 if 了..所以其实没啥大问题
|
5
wuchizhitu1988 2016-01-28 11:09:44 +08:00
为了黑而黑
|
6
zztczcx 2016-01-28 11:14:15 +08:00
反射,一行代码 解决 那么多 if
|
7
hei1000 2016-01-28 11:16:05 +08:00
虽然不是太懂 Python ,但是每次检测都执行一遍 dataItem.get("cmd")是几个意思?
|
8
SpicyCat 2016-01-28 11:16:26 +08:00
能不能发个 gist
另外,像这种一长串 if 语句到底有什么坏处?除了看起来不高大上以外? |
9
jatsz 2016-01-28 11:17:10 +08:00
觉得代码也没有太难看,业务复杂度,你用代码也解决不了。
非要说让代码变好看一点,而然实际上用户不大,那就是讲 else 的部分改成表驱动,方法的 dispatch 改成查表。 |
10
MarioLuisGarcia 2016-01-28 11:21:44 +08:00
吹毛求疵讲两点:
|
11
banricho 2016-01-28 11:25:35 +08:00 via Android
如果是 JS 的话
缓存 cmd obj[key]代替多个 if ( py 好像管这叫字典?) 感觉差别不大。。 |
12
MarioLuisGarcia 2016-01-28 11:27:13 +08:00
1. 这个代码里在最后的 else 分支里有多少次 if ,就会调用多少次 dataItem.get("cmd")
除了性能消耗外,还有潜在隐患。 我认为作者在这块现在 else 分支下的第一行使用 cmd_result = dataItem.get("cmd"), 之后再用 cmd_result 和字符串比较是更好的 2. 文中的比较都是相等性比较,且比较的对象字符串都不同,所以只会有一个满足条件。所以在这儿除了第一个 if 外,之后的都应该改成 elif 。这样在 elif 的某一个条件满足后,后面的 elif 语句就会停止执行了。全部使用 if 的话,每一次都要判断所有的 if 语句。 |
13
aisk 2016-01-28 11:27:36 +08:00
如果单纯因为性能考虑的话,一般都是用一个 dict 保存 key 和响应处理的函数,这样就不需要执行这么多次判断了。
不过从可读性上讲,这坨代码根本就不该写成这样。 |
14
mulog 2016-01-28 11:27:52 +08:00
别这样 说不定人家代码行数计入 KPI
|
15
EPr2hh6LADQWqRVH 2016-01-28 11:28:43 +08:00
这哥不会用 Dict 么
|
16
canesten 2016-01-28 11:49:04 +08:00 via Android
喜感十足
|
17
yimity 2016-01-28 12:21:20 +08:00
我也觉得 Dict 可以。我其实不会 Python
|
18
jpmorn OP 看起来需要来个实际点的例子学学啊
|
19
thinker3 2016-01-28 12:45:48 +08:00
这跟 url route 很类似
|
20
neilwong 2016-01-28 13:29:59 +08:00 via iPhone
昨天和大城小胖因为这个微博讨论到凌晨三点…
|
21
caomaocao 2016-01-28 13:39:23 +08:00
要用 dict 来表示 switch 呀~ python 里
|
22
sherlocktheplant 2016-01-28 13:40:25 +08:00
直接设计类的时候 cmd 和函数名一一对应就好了啊 参数用** kwargs 传就好了
|
23
icedx 2016-01-28 14:05:50 +08:00 via Android
有低级错误 另外不要轻易用 duct 代替 swirch
|
24
icedx 2016-01-28 14:05:59 +08:00 via Android
Switch
|
25
felinx 2016-01-28 14:19:16 +08:00
根据 cmd 的字符和名字规则用 getattr 自动获取函数名,代码可以简练的多。且看命名习惯,这不是一个熟练的 Python 工程师写的,一点不 Pythonic 。
|
26
gamexg 2016-01-28 14:36:32 +08:00 via Android
data 这个变量名被多次重复使用没人提吗?之后修改逻辑时很有可能掉坑里。
其他的看起来都是小问题。 反射搞不定,参数不一致。 |
27
hepochen 2016-01-28 15:45:29 +08:00 1
像这种规则性非常明确的,也不需要用到额外的 dict 来建立映射。
替换这进百行的重复代码,基本思路大抵如此: handler = getattr(self, data_item.get('cmd', '')+'_handler', None) if handler: handler(*[data_item.get(key) for key in inspect.getargspec(handler).args]) 写出脏代码并不可耻,为脏代码辩解的倒真算是可耻的。 |