Это теперь работает для тех, кто новичок в этом вопросе:Python: Почему я не могу заставить мой декоратор работать?
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()
О, нет, нет. «params» - это имя словарного аргумента. Это требует только одного аргумента. См. Включенный комментарий. – orokusaki
@orokusaki, когда вы пишете 'def foo (self, params):', это ** TWO ** аргументы, а не один - считать их. Ваш отказ от подтверждения этого - это то, что вызывает ошибку в вашем коде: вы ** имеете **, чтобы принять вызов одним или двумя аргументами, а ваша 'def wrapper', как закодированная, просто не делает (это вынуждает единственный аргумент, как вы думаете, это должно ... и вы ошибаетесь, Python говорит вам это, и я тоже ;-). –
Вы видели мой вопрос Алекс? Как заставить декоратор работать для метода класса и нормальной функции без наличия двух версий декоратора. Я не полный нуб. Я просто не понимаю, как сделать версию, например, методами и функциями. – orokusaki