someDecorator
w pierwszym fragmencie kodu jest regularny dekorator:
@someDecorator
def someMethod():
pass
jest równoważna
someMethod = someDecorator(someMethod)
Z drugiej strony, someDecorator
w drugim fragmencie kodu jest wymagalne, która zwraca dekorator:
@someDecorator()
def someMethod():
pass
równoważny
someMethod = someDecorator()(someMethod)
jak wskazał Duncan w komentarzach, niektórzy dekoratory są zaprojektowane do pracy w obie strony. Oto bardzo podstawowe wdrożenie takiego dekoratora:
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
jest bardziej skomplikowany przykład.
Nie są to nawiasy klamrowe, ale nawiasy. Klamrami są '{}'. –
@DanielRoseman Dobra wskazówka, często walcząc ze znalezieniem właściwych słów ... – BendEg
Świetna odpowiedź poniżej. Warto zauważyć, że różnica jest taka sama jak różnica między 'foo' i' foo() '* gdziekolwiek *, w tym nie w dekoratorze. –