想編寫乙個裝飾器,該裝飾器可以不帶引數(如@decorator)使用,也可以帶可選引數(如@decorator(x,y,z))使用。 但是,由於簡單修飾符和帶有引數的修飾符之間的呼叫約定不同,因此似乎沒有直接的方法。
以下示例解決了這種程式設計一致性問題:
from functools import wraps, partial
import logging
def logged(func=none, *, level=logging.debug, name=none, message=none):
if func is none:
return partial(logged, level=level, name=name, message=message)
logname = name if name else func.__module__
log = logging.getlogger(logname)
logmsg = message if message else func.__name__
@wraps(func)
log.log(level, logmsg)
return func(*args, **kwargs)
# example use
@logged
def add(x, y):
return x + y
@logged(level=logging.critical, name='example')
def spam():
print('spam!')
編寫可選引數的裝飾器函式
想編寫乙個裝飾器,該裝飾器可以不帶引數 如 decorator 使用,也可以帶可選引數 如 decorator x,y,z 使用。但是,由於簡單修飾符和帶有引數的修飾符之間的呼叫約定不同,因此似乎沒有直接的方法。以下示例解決了這種程式設計一致性問題 from functools import wra...
Decorator裝飾器定義可選引數
一般帶引數裝飾器。使用裝飾器時需要加上括號 logged logged將會提示引數錯誤。import logging logging.basicconfig level logging.debug deflogged level logging.info defdecorator func def ...
PHP函式的可選引數
一 xmlns php function values price tax values 100 0.25 為可選引數賦值0.25 values 100 沒有給可選引數賦值 二 執行結果 125 100 三 注意事項 1 可選引數放在引數列表末尾,並且指定其預設值為空。2 當使用預設引數時,預設引數...