Cela fonctionne maintenant pour les nouveaux à cette question:Python: Pourquoi je n'arrive pas à faire fonctionner mon décorateur?
class ensureparams(object):
"""
Used as a decorator with an iterable passed in, this will look for each item
in the iterable given as a key in the params argument of the function being
decorated. It was built for a series of PayPal methods that require
different params, and AOP was the best way to handle it while staying DRY.
>>> @ensureparams(['name', 'pass', 'code'])
... def complex_function(params):
... print(params['name'])
... print(params['pass'])
... print(params['code'])
>>>
>>> params = {
... 'name': 'John Doe',
... 'pass': 'OpenSesame',
... #'code': '1134',
... }
>>>
>>> complex_function(params=params)
Traceback (most recent call last):
...
ValueError: Missing from "params" dictionary in "complex_function": code
"""
def __init__(self, required):
self.required = set(required)
def __call__(self, func):
def wrapper(*args, **kwargs):
if not kwargs.get('params', None):
raise KeyError('"params" kwarg required for {0}'.format(func.__name__))
missing = self.required.difference(kwargs['params'])
if missing:
raise ValueError('Missing from "params" dictionary in "{0}": {1}'.format(func.__name__, ', '.join(sorted(missing))))
return func(*args, **kwargs)
return wrapper
if __name__ == "__main__":
import doctest
doctest.testmod()
Oh, non non. 'params' est le nom d'un argument du dictionnaire. Cela prend juste un argument. Voir le doctest inclus. – orokusaki
@orokusaki, lorsque vous écrivez 'def foo (self, params):', ce sont des arguments ** DEUX **, pas un - comptez-les. Votre échec à reconnaître ceci est ce qui cause le bug dans votre code: vous devez accepter d'être appelé avec un ou deux args, et votre 'def wrapper', comme codé, ne le fait pas (cela force un un seul argument, juste comme vous pensez qu'il devrait ... et vous avez tort, Python vous le dit, et moi aussi ;-). –
Avez-vous vu ma question Alex? Comment puis-je obtenir le décorateur de travailler pour une méthode d'une classe et une fonction normale sans avoir deux versions du décorateur. Je ne suis pas un noob complet. Je ne comprends pas comment faire une version par exemple des méthodes et des fonctions. – orokusaki