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

时间:2017-07-26 19:39:01

标签: python methods callable sonos

我正在探索一个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试图打电话吗?并且,什么可以导致方法“存在”但完全不可用?

2 个答案:

答案 0 :(得分:3)

callable没有尝试调用该对象。它只检查对象是否具有调用操作符的实现。

尝试首先检索属性时发生异常。可以重写属性访问以在Python中执行任何操作,并且此对象的cross_fade属性实现为property,在getter上具有only_on_master装饰器,如果您引发异常尝试检索奴隶上的属性。

答案 1 :(得分:1)

如果我们查看source code,我们会看到int[]{1,1,1}实际上是属性:

cross_fade

反过来,getter被包装到only_on_master中,这是引发异常的地方。