Cómo tomar una función como un argumento? (Pitón)
Pregunta
Estoy escribiendo un programa para calcular el volumen de un sólido de rotación. El primer paso de este es calcular una integral. Estoy usando scipy.integrate
para esto, pero no puedo averiguar la mejor manera de tener una ecuación (como entrada x=x**2
en la línea de comandos que estaba planeando originalmente en la adición de un argumento 'con respecto a: x | y' y después. teniendo la función como lambda. Por desgracia, argparse
no tomará lambda como un tipo de argumento, y tratando de utilizar una cadena para construir un lambda (f = lambda x: args.equation
) simplemente devuelve una cadena (comprensiblemente realmente).
Esto es lo que tengo hasta ahora:
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)
Se apreciará Cualquier consejo gracias
Solución
Si no hay absolutamente ninguna preocupación acerca de los riesgos de seguridad de dejar correr el usuario arbitrario código Python , a continuación, puede utilizar eval
para crear un objeto invocable:
volume(eval('lambda x: %s' % args.equation), args.a, args.b)
Otros consejos
debería ser capaz de utilizar eval()
en la cadena que recibe de su argumentos:
>>> f = eval("lambda x: x**2")
>>> f(5)
25