Come prendere una funzione come argomento? (Pitone)
Domanda
Sto scrivendo un programma per calcolare il volume di un solido di rotazione. Il primo passo di questo consiste nel calcolare un integrale. Sto usando scipy.integrate
per questo, ma non riesco a capire il modo migliore per avere un'equazione (come ingresso x=x**2
nella riga di comando Mi è stato originariamente pensando di aggiungere un argomento 'per quanto riguarda: x | y' e poi. prendendo la funzione di lambda. Purtroppo, argparse
non prenderà lambda come un tipo di argomento, e cercando di utilizzare una stringa per costruire un lambda (f = lambda x: args.equation
) solo restituisce una stringa (comprensibilmente davvero).
Ecco quello che ho finora:
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)
Qualsiasi consiglio sarà apprezzato grazie
Soluzione
Se non ci sono assolutamente problemi su rischi per la sicurezza dal lasciando in funzione utente arbitrario codice Python , quindi è possibile utilizzare eval
per creare un oggetto callable:
volume(eval('lambda x: %s' % args.equation), args.a, args.b)
Altri suggerimenti
Si dovrebbe essere in grado di utilizzare eval()
sulla stringa si ottiene dal vostro argomenti:
>>> f = eval("lambda x: x**2")
>>> f(5)
25