gpt4 book ai didi

python - 什么时候调用 callable() 仍然会失败?

转载 作者:太空宇宙 更新时间:2023-11-03 15:44:21 26 4
gpt4 key购买 nike

documentation for callable()在 Python 3.6(和 for Python 2.7)中部分说:

If this returns true, it is still possible that a call fails, but if it is false, calling object will never succeed.

在这种情况下,“失败”是什么意思?只是“标准”函数调用失败,例如参数不匹配或引发的异常?如果还有别的意思,是什么意思?

简而言之,在什么情况下callable(obj)可以返回true但调用obj()会失败?

最佳答案

首先,任何 函数调用都可能失败,这是千真万确的事实。也许你在检查 callable 之间改变了对象并调用它。或者对象可调用的,但你传递给它的参数无效,或者它在操作期间引发了异常,或者用户只是点击了 ^C,...

但这不是文档警告的内容。他们告诉你,你可以获得 TypeError: <something> is not callable从做func()即使callable(func)返回 True .

虽然这没有完全记录(也许允许其他实现来优化事情?),callable基本上实现为:

def callable(object):
return hasattr(object, '__call__')

这至少是隐含的,即使没有直接说明:

Note that classes are callable (calling a class returns a new instance); instances are callable if their class has a __call__() method.

关键是真的一切都是一个实例。 (类是它们的元类的实例,它总是有一个 __call__ 方法。)


因此,创建打破测试的内容非常容易。一种方法是只给它一个不可调用的 __call__ :

>>> class C:
... __call__ = 0
>>> c = C()
>>> callable(c)
True
>>> c()
TypeError: 'int' object is not callable

另外,请注意声称假阴性是不可能的(“如果它是假的,调用对象将永远不会成功”)意味着在 __call__ 上进行特殊方法查找。方法必须使用与 callable 相同的机制(或严格较弱的)。因此,例如,如果 Python 实现选择不忽略元类 __getattribute__查找或实例 __dict__查找 __call__ , 它的 callable必须这样做。你可以看到这个(至少在 CPython 3.7 中):

>>> class D:
... pass
>>> d = D()
>>> d.__call__ = 0
>>> callable(d)
False
>>> d()
TypeError: 'D' object is not callable

(测试其他特殊方法查找的可能性留给读者作为练习,这意味着我懒得把它们都写下来并且很高兴猜测它们都会以相同的方式进行......)


在 CPython 中, callable 实际上只是调用 C API 方法 PyCallable_Check .和 that function只是检查对象的类型是否有 tp_call投币口。对于在 Python 中实现的类型,当且仅当 __call__ 是正确的。直接在类或基类上定义。

关于python - 什么时候调用 callable() 仍然会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50975107/

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