【问题标题】:Python convert string to function and execute itPython将字符串转换为函数并执行
【发布时间】:2021-12-30 06:19:27
【问题描述】:

我在数据库中有几个函数作为字符串,并且有一个主函数应该从数据库中获取这些函数并将它们作为函数执行,而不是作为文本执行。

如何将字符串(描述函数)转换为带参数的函数并在 Python 中执行?

我尝试了 exec,但我无法从函数中返回某些内容并使用它。

例如我的函数:

some_function = """
def my_random_function(some_param):
    print(some_param)
    return time.time()
"""

【问题讨论】:

  • 嘿,@Nataly Firstova,试试这个:stackoverflow.com/questions/7719466/…
  • exec定义的函数可以像普通函数一样工作,当然你也可以得到返回值。确保您已导入所有基本库(在您的示例中为time)。 PS:我会在回答中为您发布一些代码

标签: python string function exec


【解决方案1】:

100% 在任何情况下都不要这样做 免责声明...

exec 声明:

code = """
def f(x):
    x = x + 1
    return x

print('This is my output.')
print(f(my_var))
"""

exec(code, {}, {"my_var": 1})

输出:

This is my output.
2

【讨论】:

  • 100% 在任何情况下都不要这样做 免责声明... - 为什么?我只是想把所有的功能都放在数据库中,并且在不重新加载服务器的情况下更改它
  • 这是非常不安全和不可靠的。想要在 PHP 中执行此操作的人请参见此处:stackoverflow.com/a/14653229/6014330
  • 也许您知道更好的方法?我想在数据库中添加结束编辑我的功能(通过前端编辑器)并在服务器上的主要功能中执行它(无需重新部署)
  • 这正是问题所在。你想做的事情本质上是危险的。就像要求在没有用户名和密码的情况下登录您的银行帐户一样。你不能安全地做到这一点。
  • CI/CD 的全部意义在于,您可以进行更改、测试、验证等,然后升级到环境并再次测试...您应该无法更改代码无需部署即可飞行。
【解决方案2】:

exec定义的函数可以像普通函数一样工作,当然你也可以得到返回值。确保您已导入所有基本库(在您的示例中为time

import time

some_function = """
def my_random_function(some_param):
    print(some_param)
    return time.time()
"""

exec(some_function)
return_value = my_random_function(3)
print(return_value)

输出

3
1637328869.3345668

【讨论】:

  • 我收到 IDE 错误 return_value = my_random_function(3)
  • 错误是什么?你能提供错误所说的内容吗?
  • 未解决的参考“my_random_function”
  • 我猜你正在使用 Pycharm。这是 Pycharm 错误,因为 Pycharm 需要知道在哪里可以找到函数,并且它无法在字符串中找到函数。 Python可以流畅运行,因为函数会出现在exec运行之后。
猜你喜欢
  • 2011-12-17
  • 2019-01-03
  • 1970-01-01
  • 2022-08-12
  • 2018-11-24
  • 1970-01-01
相关资源
最近更新 更多