Per un decoratore che sto scrivendo mi piacerebbe manipolare una specifica di nome parametro di una funzione. Si consideri il seguente decoratore:Come posso trattare argomenti posizionali come argomenti chiave in Python 2
def square_param(param):
def func_decorator(func):
def func_caller(*args,**kwargs):
kwargs[param] = kwargs[param] * kwargs[param]
return func(*args,**kwargs)
return func_caller
return func_decorator
applicata sulla funzione successiva:
@square_param('dividend')
def quotient(divisor=1,dividend=0):
return dividend/divisor
Ciò funzionerà se dividendo è chiamato come ad esempio l'argomento parola chiave:
>>> quotient(dividend=2)
4
Tuttavia, quando somministrato come un argomento posizionale questo fallirà.
>>> quotient(3,4)
TypeError: quotient() got multiple values for keyword argument 'dividend'
Con Python 3 ho potuto risolvere questo forzando il parametro da always given as a keyword:
@square_param('dividend')
def quotient(divisor=1,*,dividend=0):
return dividend/divisor
ma vorrei sostenere Python 2 e anche io vorrebbe mettere come piccoli restrizioni sulla funzione .
C'è un modo che io possa risolvere questo comportamento a mio decoratore?
Esaminare il modulo ispezionare. Potrebbe avere quello che ti serve per questo. Dai un'occhiata a getargspec. – Dirk