我正在编写针对版本3.2和更高版本的Python。它看起来像使用内置函数可调用是最直接和最有效的方式来做到这一点。我已经看到了关于hasattr(x, "__call__")
,collections.Callable(x)
的建议,并且只是在尝试呼叫周围使用try/except
。使用callable(x)与hasattr(x,“__call__”)
我测试过可调用的项目(类和函数),使用timeit
进行100,000次迭代;在这两种情况下使用可调用只需要检查属性的大约75%的时间。当不可调用的项目(一个整数和一个字符串)使用callable保持与类或函数相同的成本时,检查该属性比类或函数贵大约2.3倍。我没有想到这种差异,但它也有利于清晰简洁的方法。
但是我对Python比较陌生,没有专家,所以有没有原因我不知道我应该使用hasattr方法或其他方法?
FWIW,各种时间表的结果如下。第一个字符只是timeit的第二个字符,第二个字符表示正在测试的对象的类型(c = class,f = function,i = integer,s = string),其余的表示方法(attr - check属性, call - use callable,try - use try/except)。
tcattr 0.03665385400199739 tccall 0.026238360142997408 tctry 0.09736267629614304 tfattr 0.03624538065832894 tfcall 0.026362861895904643 tftry 0.032501874250556284 tiattr 0.08297350149314298 ticall 0.025826044152381655 titry 0.10657657453430147 tsattr 0.0840187013927789 tscall 0.02585409547373274 tstry 0.10742772077628615
旁注:可调用[已在python3.0中移除](http://www.python.org/dev/peps/pep-3100/#built-in-namespace)并且 - 在注意到[这是一个糟糕的选择](http://bugs.python.org/issue10518) - [带回3.2](http://docs.python.org/3.2/library/functions.html?highlight=callable#callable) – mata 2013-05-05 20:22:23