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

Check if __builtins__ is callable using list comprehension, avoiding errors with eval(print)

我想检查 __builtins__ return True 中列出的那些是否来自 callable(作为测试它们是否为函数的方法) .我希望 return Python 文档中的 those 函数列表。我意识到其他项目,例如 AttributeError return True for callable,这很好。

下面的return是我调用它时的SyntaxError(由于eval(print)):

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

如何测试 __builtins__ 中的哪些函数是可调用函数,同时避开 eval(print) 抛出的错误?

一个更可靠的方法是使用 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]
>>>

你应该使用 getattr 而不是 eval:

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

然后您可以过滤可调用对象的结果:

filter(callable, builtins) 

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

inspect.getmembers(__builtins__, callable)