gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:22:38 27 4
gpt4 key购买 nike

我正在测试 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com