可调问题,检测超过__call__

时间:2013-09-05 20:14:23

标签: 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可以调用。)

1 个答案:

答案 0 :(得分:6)

您的__getattr__挂钩会返回所有属性的值:

>>> h.__call__
'blah'

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

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

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

注意:这仅将 应用于旧式实例;新样式的实例(Python 3中的默认值,以及Python 2中从object继承的任何类)未针对__call__属性进行测试;相反,我们会咨询班级本身。

因此,您可以切换到新式课程以缓解此问题,但您的__getattr__仍然不应过于宽泛。