callable(obj) 是否尝试调用?
Does callable(obj) make an attempt to call?
我正在探索 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
是否尝试跟注?而且,什么会导致方法 "exist" 但完全不可用?
callable
不会尝试调用该对象。它只检查对象是否具有调用运算符的实现。
首先尝试检索属性时出现异常。在 Python 中可以重写属性访问以执行任何操作,并且此对象的 cross_fade
属性实现为 property
,在 getter 上带有 only_on_master
装饰器=] 如果您尝试检索从站上的属性,则会引发异常。
如果我们查看 source code,我们会发现 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
"""
# ...
反过来,getter 被包装到 only_on_master
中,这是引发异常的地方。
我正在探索 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
是否尝试跟注?而且,什么会导致方法 "exist" 但完全不可用?
callable
不会尝试调用该对象。它只检查对象是否具有调用运算符的实现。
首先尝试检索属性时出现异常。在 Python 中可以重写属性访问以执行任何操作,并且此对象的 cross_fade
属性实现为 property
,在 getter 上带有 only_on_master
装饰器=] 如果您尝试检索从站上的属性,则会引发异常。
如果我们查看 source code,我们会发现 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
"""
# ...
反过来,getter 被包装到 only_on_master
中,这是引发异常的地方。