Декораторы с любыми видами аргументов - именованными / ключевыми словами, неназванными / позиционными или некоторыми из каждого - по существу, теми, которые вы вызываете в строке @name
вместо того, чтобы просто упомянуть там - нужен двойной уровень вложенности (в то время как декораторы, о которых вы только что упомянули, имеют один уровень вложенности).Это касается даже аргументов без аргументов, если вы хотите вызвать их в строке @
- вот самый простой декоратор с двойным вложением, ничего не делающий:
def double():
def middling():
def inner(f):
return f
return inner
return middling
Вы бы использовали это как
@double()
def whatever ...
, обратите внимание на круглые скобки (в данном случае пустые, поскольку нет ни аргументов, ни нужных, ни нужных): они означают, что вы звоните double
, чтовозвращает middling
, что украшает whatever
.
Как только вы увидите разницу между "вызовом" и "просто упоминанием", добавить (например, необязательно) именованные аргументы несложно:
def doublet(foo=23):
def middling():
def inner(f):
return f
return inner
return middling
можно использовать как:
@doublet()
def whatever ...
или как:
@doublet(foo=45)
def whatever ...
или, что эквивалентно:
@doublet(45)
def whatever ...