python - 可调用问题,检测到的不仅仅是 __call__

标签 python

我正在测试 simpleTAL 模板库,它使用 callable 来测试传入模板的对象是否为函数。 callable 的定义是说如果一个对象包含魔法方法__call__,那么它就是可调用的。另见 What is a "callable" in Python? .

但是,使用以下类定义创建的对象(python 2.7.4)

class H:
    def __init__(self, val):
        self.a = val
    def __getattr__(self, name):
        return 'blah'

h = H(1)
callable(h)

将返回 True。但是,如果 __getattr__ 引发 AttributeError,系统地这样做没有意义,它将返回 False!

有人可以阐明这个问题并可能提供解决方案吗? (我不希望 h 是可调用的)。

最佳答案

您的 __getattr__ Hook 返回所有 属性的值:

>>> h.__call__
'blah'

因此 hasattr(h, '__call__') 的测试返回 True:

>>> hasattr(h, '__call__')
True

确保为对象不支持的属性引发 AttributeError

注意:这适用于旧式实例;新式类的实例(Python 3 中的默认类,以及 Python 2 中任何继承自 object 的类)的实例未针对 __call__ 属性进行测试;相反,类本身被咨询。

因此,您也可以切换到新型类来缓解这种情况,但您的 __getattr__ 仍然不应太宽泛。

关于python - 可调用问题,检测到的不仅仅是 __call__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18645111/

相关文章:

python - 将 concurrent.futures 与 Flask 结合使用会提高性能吗

python - 以编程方式管理 'balance' 时间(生病/休假)

python - 我需要创建一个函数,将整数转换为二进制,并在 python 中使用一组位数

python - 优化这个 Django 代码?

python - 数学公式的树形(作为点串)

javascript - python 和 js 中的 Websocket

python - a[ :] = b and a = b[:]? 之间的区别(Python)

python - re.finditer() 实例是否无法匹配原始模式?

python - 使用 GPU PyOpenCL 进行优化的不同方法 python 代码 : extern function inside kernel GPU/PyOpenCL

python - 为什么我未 pickle 的顺序与 pickle 时的顺序不同?