【问题标题】:How to define a function name using a string如何使用字符串定义函数名
【发布时间】:2019-09-18 18:31:04
【问题描述】:

我正在尝试创建一个更动态的程序,在其中我根据变量字符串定义函数的名称。

尝试使用这样的变量定义函数:

__func_name__ = "fun"

def __func_name__():
  print('Hello from ' + __func_name__)

fun()

想要这个输出:

Hello from fun

我发现的唯一例子是: how to define a function from a string using python

【问题讨论】:

  • 您需要使用exec。但是不要。这不是一件好事。
  • @rdas 为什么不是一件好事?
  • 这不是“更动态的”——它很糟糕。不要这样做。
  • 除了对 RCE 来说是一个巨大的风险之外,它并不比普通代码更好:stackoverflow.com/questions/1933451/…
  • @isethi 为什么你认为动态命名函数是你应该做的事情,为什么 Python 应该允许你这样做?这很危险/几乎毫无意义...... Python 确实会尽量避免让你在脚上开枪......(虽然 - 如果你真的想......它确实会让你......)

标签: python python-3.x


【解决方案1】:

您可以更新globals:

>>> globals()["my_function_name"] = lambda x: x + 1
>>> my_function_name(10)
11

但通常使用具有相关功能的字典更方便:

my_func_dict = {
    "__func_name__" : __func_name__,
}

def __func_name__():
  print('Hello')

然后使用 dict 以 name 作为 key 取回函数:

my_func_dict["__func_name__"]()

【讨论】:

  • 有没有办法像在普通结构化函数中一样在 lambda 中运行多行代码?
  • @isethi,你最好只定义一个函数,我以 lambda 为例,但你可以在那里使用任何可调用对象。
【解决方案2】:

这也应该这样做,使用globals 即时更新函数名称。

def __func_name__():
  print('Hello from ' + __func_name__.__name__)

globals()['fun'] = __func_name__

fun()

输出将是

Hello from __func_name__

【讨论】:

  • Err...这比仅仅做提供什么:fun = __func_name__? (虽然还不清楚......我觉得 OP 可能希望输出是“Hello from fun”......)
  • 是的,你是对的!让我修改答案以使其更好:)
猜你喜欢
  • 1970-01-01
  • 2011-08-20
  • 2021-07-15
  • 2012-06-19
  • 2020-11-07
  • 1970-01-01
  • 2020-01-02
  • 2015-04-22
  • 2011-09-18
相关资源
最近更新 更多