使用列表推导检查__builtins__是否可调用,避免使用eval(print)出错

时间:2017-02-13 09:53:01

标签: python python-2.7 eval built-in

我想检查__builtins__中列出的内容是否从True返回callable(作为测试它们是否为函数的方法)。我希望在Python文档中返回those函数列表。我意识到其他项目,例如AttributeError会为True返回callable,这很好。

以下内容在我致电时会返回SyntaxError(由于eval(print)):

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

如何在回避__builtins__引发的错误时测试eval(print)中哪些是可调用函数?

2 个答案:

答案 0 :(得分:3)

您应该使用getattr代替eval

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

然后你可以过滤callables的结果:

filter(callable, builtins) 

请注意,也可以使用inspect.getmembers。它甚至允许使用可选参数来过滤结果:

inspect.getmembers(__builtins__, callable)

答案 1 :(得分: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]
>>>