写代码不能太简单了

2011-01-10 17:35:06 +08:00
 ayanamist
项目中用了反射,直接getattr('funcname')(*args)调用,外面包裹一个try..except AttributeError,结果调用的某个函数刚好也报了AttributeError的错误,于是一直提示错误,一直找不到原因。后来加了N多logging才找到原因……
还是不能偷懒写一起,该拆开就拆开啊……教训啊……
5845 次点击
所在节点    Python
26 条回复
ssword
2011-01-12 17:05:05 +08:00
@ayanamist 见笑了,我也是python新手,只是对几个概念有耳闻而已。

楼主的情景该是猜到一些。是不是这样呢:在一个类里放很多函数,留一个函数作对外的接口,根据输入的不同分派一个不同的函数。回去想了下,使用反射也未尝不是一个好方法。要扩展,只需要往类里添加一个函数即可,比起一堆if else自是灵活的多了。

但是,这个类是不会变得很大呢。再者,用户输入那个“动态函数”名字要是Object的函数怎么办?虽不是什么大问题,估计也是会抛异常的。

前面说到lambda有点不准确,个人比较倾向于这样理解,即把可作为值传递的函数即lambda,或者说“匿名函数”。比如python允许这样

def func1(x):
return x+1

f=func1
f(1)

函数是一等公民,这一来就可以方便的传递行为。而原先的类可以简单的重构一下,只保留几个简单的接口:

class Dispatcher:
def __init__(self):
self.actions = {}

def bind(self, cmd, func):
self.action[cmd] = func

def exec(self, cmd, *args):
f = self.action[cmd]
if f: f(*args)

这一来就可以把那些函数挪到类的外面,以后要扩展的话,只要额外import一个文件即可。

d = Dispacher()

def hello():
# do something

d.bind("hello", hello)

def sayya():
# do something

d.bind("sayya", sayya)

ps: 其实Decorator也是python的一个函数式特征, @chuangbo 同学的方法很pythonic,也很喜欢 :)
ayanamist
2011-01-12 17:11:46 +08:00
@ssword @chuangbo 我还是公开一下我的情况吧。因为想了想,觉得如果脱开类,实现反而比较麻烦。
https://github.com/gh05tw01f/tweet-talk/blob/master/xmpp.py#L58
欢迎各种拍砖
ayanamist
2011-01-12 17:14:44 +08:00
chuangbo
2011-01-12 21:40:36 +08:00
ayanamist
2011-01-13 14:10:36 +08:00
@chuangbo 你是指把OAuth Consumer开放了,很多都这样做啊,我觉得这个没什么。这个东西我又不打算去申请白名单,用自己的和用我的都是一样的。除非我打算去申请白名单2W次,那就很重要了。而且我并不打算像TwiTalker那样搭建很多节点供人使用,打算问问kavin,如果kavin不打算用我的代码,那我就只用一个节点,想用的人自己部署吧,弄成像Dabr那样的情况。
david_lee_cn
2011-01-16 23:33:43 +08:00

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

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

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

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

© 2021 V2EX