Я хотел бы сделать декоратор, который может быть использован с или без параметра: Что-то вроде этого:Как построить декоратор с дополнительными параметрами?
class d(object):
def __init__(self,msg='my default message'):
self.msg = msg
def __call__(self,fn):
def newfn():
print self.msg
return fn()
return newfn
@d('This is working')
def hello():
print 'hello world !'
@d
def too_bad():
print 'does not work'
В моем коде, только использование декоратора с параметром работает: Как действовать, чтобы оба работают (с параметром и без него)?
Я думаю, это работает для вашего дела и будет для подобных случаев. Но что, если аргумент декоратора на самом деле является единственным вызываемым? Как бы вы различали декорированную функцию и аргумент? – ksrini
@ksrini: Игнасио указал это в своем [ответе] (http://stackoverflow.com/a/3931654/355230) лет назад. – martineau
Вы также можете обойти это, используя аргументы ключевых слов (например, '@trace (default = ...)'). – jtbandes