2017-07-26 91 views
1

我探索的API,並使用以下,看看有什麼方法可以不通過眼睛的所有屬性與dir()搜索:可調用(obj)是否嘗試調用?

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們試圖打電話?而且,什麼會導致方法「存在」但完全不可用?

回答

3

callable不會嘗試調用的對象。它只檢查對象是否具有調用操作符的實現。

唯一的例外發生在嘗試檢索擺在首位的屬性。訪問屬性可以覆蓋做只是在Python什麼,這個對象的屬性cross_fade實現爲propertyonly_on_master裝飾上,如果你嘗試檢索上的從屬性是拋出一個異常,吸氣。

1

如果我們看一下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 
    """ 
    # ... 

反過來,吸氣劑包裝成only_on_master這哪裏是異常。

相關問題