編寫可選引數的裝飾器函式

2022-08-27 02:42:11 字數 809 閱讀 9910

想編寫乙個裝飾器,該裝飾器可以不帶引數(如@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 當使用預設引數時,預設引數...