from functools import wraps
def foo_register(method_name=None):
"""Does stuff."""
def decorator(method):
if method_name is None:
method.gw_method = method.__name__
else:
method.gw_method = method_name
@wraps(method)
def wrapper(*args, **kwargs):
method(*args, **kwargs)
return wrapper
return decorator
Пример: следующее украшает my_function
с помощью foo_register
, а не делает его decorator
.
@foo_register
def my_function():
print('hi...')
Пример: Следующее работает как ожидалось.
@foo_register('say_hi')
def my_function():
print('hi...')
Если я хочу, чтобы он работал корректно в обоих приложениях (один из них использовал method.__name__
и один передавал имя в), я должен проверить внутри foo_register
, чтобы увидеть, является ли первый аргумент декоратором, и если да, Я должен: return decorator(method_name)
(вместо return decorator
). Такой вид "проверки, чтобы убедиться, что он вызываемый" кажется очень хаки. Есть ли лучший способ создать многопользовательский декоратор, подобный этому?
P.S. Я уже знаю, что я могу потребовать, чтобы декоратор был вызван, но это не "решение". Я хочу, чтобы API чувствовал себя естественным. Моя жена любит украшать, и я не хочу этого испортить.