我正在编写针对 3.2 及更高版本的 Python。看起来使用内置函数 callable 是最直接有效的方法。我已经看到了对 , 和 的建议hasattr(x, "__call__")
,collections.Callable(x)
并且只是try/except
在尝试调用时使用。
我测试了可调用的项目(一个类和一个函数),使用timeit
了 100,000 次迭代;在这两种情况下,使用 callable 只需要大约 75% 的时间来检查属性。当项目不可调用(整数和字符串)时,使用 callable 的成本与类或函数相同,而检查属性的成本大约是类或函数的 2.3 倍。我没想到会有这种差异,但它也有利于清晰简洁的callable(x)
方法。
但是我对 Python 比较陌生,也不是专家,所以有什么原因我不知道我应该使用 hasattr 方法还是其他方法?
FWIW,各种时间的结果如下。第一个字符只是 t 表示 timeit,第二个表示正在测试的对象的类型(c = 类,f = 函数,i = 整数,s = 字符串),其余表示方法(attr - 检查属性, call - 使用 callable,try - 使用 try/except)。
tcattr 0.03665385400199739 tccall 0.026238360142997408 tctry 0.09736267629614304 tfattr 0.03624538065832894 调用 0.026362861895904643 tftry 0.032501874250556284 tiattr 0.08297350149314298 0.025826044152381655 滴定度 0.10657657453430147 tsattr 0.0840187013927789 调用 0.02585409547373274 测试 0.10742772077628615