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 中,这是引发异常的地方。