someDecorator
nel primo pezzo di codice è un decoratore regolare:
@someDecorator
def someMethod():
pass
è equivalente a
someMethod = someDecorator(someMethod)
D'altra parte, someDecorator
nel secondo frammento di codice è un callable che restituisce un decoratore:
@someDecorator()
def someMethod():
pass
è equivalente a
someMethod = someDecorator()(someMethod)
Come sottolineato da Duncan nei commenti, alcuni i decoratori sono progettati per funzionare in entrambe le direzioni. Ecco una realizzazione piuttosto semplice di tale decoratore:
def someDecorator(arg=None):
def decorator(func):
def wrapper(*a, **ka):
return func(*a, **ka)
return wrapper
if callable(arg):
return decorator(arg) # return 'wrapper'
else:
return decorator # ... or 'decorator'
pytest.fixture
è un esempio più complesso.
Queste non sono parentesi, ma parentesi. Le parentesi graffe sono '{}'. –
@DanielRoseman buon suggerimento, spesso in difficoltà nel trovare le parole corrette ... – BendEg
Ottima risposta qui sotto. Vale la pena sottolineare che la differenza è uguale alla differenza tra 'pippo' e' pippo() '* ovunque *, incluso non in un decoratore. –