2017-02-13 25 views
1

我想檢查__builtins__中列出的那些是否從callable返回True(作爲測試它們是否是函數的方法)。我希望在Python文檔中返回一個those函數的列表。我意識到其他項目如AttributeError返回Truecallable,這很好。檢查__builtins__是否可以使用列表理解調用,避免eval錯誤(打印)

以下回報SyntaxError當我把它稱之爲(由於eval(print)):

[callable(eval(x)) for x in dir(__builtins__)] 
SyntaxError: unexpected EOF while parsing 

我如何可以測試那些__builtins__是可調用的函數,而回避從eval(print)引發的錯誤?

回答

2

一個這樣做的更可靠的方法是使用getattr

>>> [callable(getattr(__builtins__, attr)) for attr in dir(__builtins__)] 
[True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, True, True, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, True, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, True, True, True, True, True, True, True, True, True, True, True, False, True, False, False, True, True, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True] 
>>> 
3

您應該使用的getattr代替eval

builtins = map(lambda obj: getattr(__builtins__, obj), dir(__builtins__)) 

然後,您可以過濾結果爲可調用:

filter(callable, builtins) 

請注意,也可以我們e inspect.getmembers。它甚至允許可選的參數來過濾結果:

inspect.getmembers(__builtins__, callable) 
相關問題