我正在探索一个 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
这是引发异常的地方。