使用 Python 中的字符串调用内置函数
Call a built-in function with a string in Python
我参考了以下主题,我认为 post 与其中任何一个都不重复:
- Calling a function of a module by using its name (a string)
- Python Call Function from String
- 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')
但是使用这样的代码,你可以得到像 input
或 print
这样的东西,所以你应该这样做:
if data_type in ('int', 'float'):
getattr(builtins, data_type)
else:
raise Exception('...')
我参考了以下主题,我认为 post 与其中任何一个都不重复:
- Calling a function of a module by using its name (a string)
- Python Call Function from String
- 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')
但是使用这样的代码,你可以得到像 input
或 print
这样的东西,所以你应该这样做:
if data_type in ('int', 'float'):
getattr(builtins, data_type)
else:
raise Exception('...')