如何将一个函数作为参数传递?(Python)

3
我正在编写一个计算旋转体积的程序。其中第一步是计算积分。我使用scipy.integrate进行计算,但我无法找到最好的方法来让方程(例如x=x ** 2)在命令行中输入。我最初计划添加一个参数“相对于:x | y”,然后将函数作为lambda表达式传递。不幸的是,argparse不会接受lambda作为参数类型,并且尝试使用字符串构造lambda表达式(f = lambda x:args.equation)只会返回一个字符串(可以理解)。
以下是我目前的进展:
import sys
import argparse
import math
from scipy import integrate

parser = argparse.ArgumentParser(description='Find the volume of the solid of rotation defined')
parser.add_argument('equation', help='continous function')
parser.add_argument('a', type=float, help='bound \'a\'')
parser.add_argument('b', type=float, help='bound \'b\'')
parser.add_argument('-axis', metavar='x|y', help='axis of revolution')
args = parser.parse_args()

def volume(func, a, b, axis=None):
  integral = integrate.quad(func, a, b)
  return scipy.py * integral

print volume(args.equation, args.a, args.b)

非常感谢您的建议和帮助。

谢谢。

2个回答

6

如果完全没有安全风险的顾虑,允许用户运行任意Python代码,那么你可以使用eval创建一个可调用对象:

volume(eval('lambda x: %s' % args.equation), args.a, args.b)

1
为了“安全起见”,您需要准确记录您想要允许的结构,并编写一个解析器。这是一项艰巨的工作。 - Karl Knechtel

2

您应该能够使用从参数中获取的字符串上的eval()函数:

>>> f = eval("lambda x: x**2")
>>> f(5)
25

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接