使用 Python 中的字符串调用内置函数

Call a built-in function with a string in Python

我参考了以下主题,我认为 post 与其中任何一个都不重复:

  1. Calling a function of a module by using its name (a string)
  2. Python Call Function from String
  3. Use a string to call function in Python

例如,假设我有一个字符串data_type = "int",我想直接用该字符串调用内置函数int。顺便说一句,我不能有 data_type = int 因为 data_type 实际上是从 JSON 文件加载的,即 data_type 总是一个字符串或 None.

我最好(最好)的尝试是 eval(data_type)("4"),但正如人们所建议的那样,eval 似乎不是一个好的选择,无论如何都应该避免。

另一种方法是创建像 data_type_dic = {"int": int, "float": float} 这样的字典并执行 data_type_dic[data_type]("4")。但是,创建该词典对我来说感觉就像 "reinventing the wheel"。

由于int是内置函数,不是模块中的方法,所以getattr似乎行不通。它也不是自定义函数,所以 locals()[data_type] 给出 KeyError.

那么用相应的字符串调用内置函数的最佳方法是什么?

最好的方法是still a dictionary,但是:

>>> import builtins
>>> getattr(builtins, 'int')
<class 'int'>

使用 dict唯一 明智的解决方案,就这样。不仅因为它是最明确、最明显、可读和可维护的解决方案,而且因为在将用户输入(来自外部世界的任何内容)映射到可执行代码(安全性 101:[=13)时,您绝对希望拥有完全控制权=]从不相信用户输入)。

您可以使用 getattr 函数按名称获取属性:

getattr(obj, 'attr') == obj.attr

所以你可以使用:

import builtins
getattr(builtins, 'int')

但是使用这样的代码,你可以得到像 inputprint 这样的东西,所以你应该这样做:

if data_type in ('int',  'float'): 
  getattr(builtins, data_type)
else: 
  raise Exception('...')