Call a built-in function with a string in Python
我已经提到了以下线程,我认为这篇文章不是它们的副本:
使用模块的名称(字符串)调用模块的函数
字符串中的python调用函数
使用字符串调用python中的函数
例如,假设我有一个字符串,data_type ="int",我想直接用该字符串调用内置函数int。btw i不能有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")。然而,对我来说,创建这本字典就像是"重新发明轮子"。
由于int是内置函数,而不是模块中的方法,因此getattr似乎不可行。它也不是一个自定义的函数,所以locals()[data_type]给出KeyError。
那么,用相应的字符串调用内置函数的最佳方法是什么?
- 像你说的那样使用听写是最简单的解决办法。不想过分杀人
- {item.__name__:item for item in (int, float)}
最好的办法还是字典,但是:
1 2 3
| >>> import builtins
>>> getattr(builtins, 'int')
<class 'int'> |
使用dict是这里唯一健全的解决方案,句号。不仅因为它是最明确、显而易见、可读和可维护的解决方案,而且因为在将用户输入(来自外部世界的任何内容)映射到可执行代码(安全101:从不信任用户输入)时,您明确希望拥有完全的控制权。
- 是的+1用于重新提供信息,比如EDOCX1[0]可能
您可以使用getattr函数按名称获取属性:
1
| getattr(obj, 'attr') == obj.attr |
所以你可以使用:
1 2
| import builtins
getattr(builtins, 'int') |
但是有了这样的代码,云可以得到像input或print这样的东西,所以应该这样做:
1 2 3 4
| if data_type in ('int', 'float'):
getattr(builtins, data_type)
else:
raise Exception('...') |