Вы должны прочитать немного больше о Python-декораторах.Вы получаете сообщение об ошибке:
def command(name):
ALLCOMMANDS[name] = name
return name
Из-за return name
.
Декораторы являются просто синтаксическим сахаром.Это:
@command
def foo():
print('bar')
Эквивалентно:
def foo():
print('bar')
foo = command(foo)
Отсюда видно, почему работает ваш оригинальный декоратор.В конце вы return function
.
Вещи становятся немного сложнее, когда у вас есть декоратор, который принимает аргументы.Desugared следующее:
@command('nickname')
def foo():
print('bar')
Выглядит так:
def foo():
print('bar')
foo = command('nickname')(foo)
Итак, чтобы написать декоратор, который принимает аргументы, декоратору необходимо вернуть функцию, которая принимает функцию для декорации какаргумент:
def command(nickname):
def wrapped(f):
ALLCOMMANDS[nickname] = f
return f
return wrapped
Также рассмотрите возможность сделать ALLCOMMANDS
атрибутом вашей команды вместо глобального (UPPER_SNAKE
обычно зарезервировано для констант):
def command(nickname):
def wrapped(f):
command._functions[nickname] = f
return f
return wrapped
command._functions = {}