簡體   English   中英

從裝飾器的“推”屬性到Python中的裝飾函數

[英]“Push” attribute from decorator to decorated function in Python

來自初學者的一些基本問題。 有沒有一種方法可以不使用函數參數將屬性“推送”到裝飾函數?

import sys
from functools import wraps


def decorator_(func):
    @wraps(func)
    def newfunc():
        func.some_attr = 'some_attr'
        func()
    return newfunc

@decorator_
def decorated_function():
    # ??? access some_attr ???
    print some_attr

def main():
    decorated_function()

if __name__ == '__main__':
    sys.exit(main())

提前致謝。

根據您使用的是Python 2還是3,可以將變量注入到函數的globals ,如下所示:

Python 2

func.func_globals["some_attr"] = "some_value"

Python 3

func.__globals__["some_attr"] = "some_value"

如果改為在new_func上設置該屬性,則可以簡單地以decorated_function.some_attr訪問它:

def decorator_(func):
    @wraps(func)
    def newfunc():
        newfunc.some_attr = 'some_attr'
        func()
    return newfunc

@decorator_
def decorated_function():
    print(decorated_function.some_attr)

否則,自動wraps會使原始函數在Python 3中作為decorated_function.__wrapped__函數decorated_function.__wrapped__可用:

def decorator_(func):
    @wraps(func)
    def newfunc():
        func.some_attr = 'some_attr'
        func()
    return newfunc

@decorator_
def decorated_function():
    print(decorated_function.__wrapped__.some_attr)

在Python 2中, __wrapped__不是通過wraps設置的,因此我們需要手動設置它:

def decorator_(func):
    @wraps(func)
    def newfunc():
        func.some_attr = 'some_attr'
        func()
    newfunc.__wraps__ = func
    return newfunc

但是,這聽起來像是XY問題。 如果要將值傳遞給decorated_function ,則應讓decorator_將其作為參數傳遞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM