用python中的字符串调用内置函数

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

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


    最好的办法还是字典,但是:

    1
    2
    3
    >>> import builtins
    >>> getattr(builtins, 'int')
    <class 'int'>

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


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

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

    所以你可以使用:

    1
    2
    import builtins
    getattr(builtins, 'int')

    但是有了这样的代码,云可以得到像inputprint这样的东西,所以应该这样做:

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