Проверьте ответ Алекса, чтобы понять Python декораторы; кстати:
1) что вы не понимаете в декораторах? Разве вы не понимаете декораторы как общую концепцию или декораторы Python? Осторожно, «классический» шаблон декоратора, Java-аннотации и Python-декораторы - это разные вещи.
2) Python-декораторы всегда должны возвращать функцию, например, в вашем коде возвращаемое значение param_checker ([...]) должно быть функцией, которая принимает функцию в качестве param (функция должна быть оформлена) и возвращает функцию с той же сигнатурой, что и my_decorated_function. Взгляните на следующий пример; функция декоратора выполняется только один раз (когда создается класс), тогда как декорированная функция выполняется при каждом вызове. В этом конкретном примере он вызывает исходную функцию, но это не является обязательным требованием.
def decorator(orig_func):
print orig_func
def decorated(self, a):
print "aahahah", orig_func(self, a)
return decorated
class Example(object):
@decorator
def do_example(self, a):
return 2 * a
m = Example()
m.do_example(1)
3) вы, возможно, делаете не лучшее, что используете декораторы. Обычно их следует использовать, когда есть какая-то концепция, которая совершенно ортогональна тому, что вы на самом деле программируете, и может использоваться повторно - это, по сути, способ выполнения AOP на Python. Ваш param_checker может быть не таким ортогональным - если ваш декоратор используется только один раз, то, вероятно, вообще не стоит использовать декоратор. Ваш param_checker, кажется, имеет место - он предполагает, что оформленный func принимает один аргумент, являющийся словарем - много ли в вашем коде функций с такой сигнатурой и поведением? Если ответ «нет», просто проверьте параметры в начале функции и вызовите исключение, если они отсутствуют.