![](/img/trans.png)
[英]Python decorator show signature and docstring from both decorator and decorated function
[英]“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
,如下所示:
func.func_globals["some_attr"] = "some_value"
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.