如何将函数作为参数?(Python)

如何将函数作为参数?(Python),python,lambda,input,scipy,argparse,Python,Lambda,Input,Scipy,Argparse,我正在写一个程序来计算旋转固体的体积。第一步是计算一个积分。我使用的是scipy.integrate,但我想不出建立方程的最佳方法(如命令行中的x=x**2输入。我最初计划添加一个参数“关于:x | y”,然后将函数作为lambda。不幸的是,argparse不会将lambda作为参数类型,并尝试使用字符串构造lambda(f=lambda x:args.equation)只返回一个字符串(真的可以理解) 以下是到目前为止我得到的信息: import sys import argparse im

我正在写一个程序来计算旋转固体的体积。第一步是计算一个积分。我使用的是
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)
如有任何建议,将不胜感激 谢谢

您应该能够使用从参数中获得的字符串:

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

如果完全不担心让用户运行任意Python代码的安全风险,则可以使用
eval
创建可调用对象:

volume(eval('lambda x: %s' % args.equation), args.a, args.b)
为了“安全”,您必须准确地记录您希望允许的构造,并编写解析器。这需要大量的工作。