【问题标题】:Call a built-in function with a string in Python在 Python 中使用字符串调用内置函数
【发布时间】:2018-12-23 20:42:00
【问题描述】:

我参考了以下主题,我不认为这篇文章与其中任何一个重复:

  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")。然而,对我来说,创建该词典就像是在“重新发明轮子”。

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

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

【问题讨论】:

  • 使用你所说的字典是最简单的解决方案。不想矫枉过正
  • {item.__name__:item for item in (int, float)}

标签: python function-calls


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    使用dict 是这里唯一理智的解决方案,期间。不仅因为它是最明确、最明显、可读和可维护的解决方案,还因为您绝对希望在将用户输入(来自外部世界的任何内容)映射到可执行代码(安全 101:从不相信用户输入)。

    【讨论】:

    • 是的 +1 用于加强这一点,比如 getattr(builtins, "quit")() 也许
    【解决方案3】:

    您可以使用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('...')
    

    【讨论】:

      猜你喜欢
      • 2011-05-07
      • 2021-11-17
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 2012-10-02
      • 2021-05-10
      • 2020-03-20
      相关资源
      最近更新 更多