可调用(obj)是否尝试调用?



我正在探索一个 API,并使用以下方法查看哪些方法可用,而无需用眼睛搜索所有属性dir()

methods = [m for m in dir(kt) if callable(getattr(kt, m))]

引发异常:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Python/2.7/site-packages/soco/core.py", line 103, in inner_function
raise SoCoSlaveException(message)
soco.exceptions.SoCoSlaveException: The method or property "cross_fade" can only be called/used on the coordinator in a group

好的,所以我不能使用cross_fade,没关系。 但我没有试图打电话,我只是想看看我是否可以。

我本以为callable()可以使用类似于type()的东西进行检查,但似乎它正在尝试拨打电话并且只捕获某些类型的异常。

当我尝试type(kt.cross_fade)时,以及当我只是在终端中尝试>>> kt.cross_fade时,我得到了同样的异常。

所以我想这里有两个问题:callable会尝试打电话吗? 而且,什么会导致方法"存在"但完全不可用?

callable不会尝试调用对象。它仅检查对象是否具有调用运算符的实现。

首先尝试检索属性时发生异常。属性访问可以被覆盖以在 Python 中执行几乎任何事情,并且此对象的cross_fade属性被实现为一个property,在 getter 上带有一个only_on_master装饰器,如果您尝试在从属服务器上检索属性,则会引发异常。

如果我们查看源代码,我们会看到cross_fade实际上是一个属性:

@property
@only_on_master  # Only for symmetry with the setter
def cross_fade(self):
"""The speaker's cross fade state.
True if enabled, False otherwise
"""
# ...

反过来,吸气剂被包装到only_on_master这是引发异常的地方。

相关内容

  • 没有找到相关文章

最新更新