我的任務是在裝飾器中傳遞一個帶有值的變數,該變數會將變數替換為它的值作為字典中的鍵,如下所示:
@parameters(param1 = parameter1)
x = function(param1 = 1, param2 = 2)
extract {paramter1:1, param2:2}
我當前的代碼是:
def dump_args(func):
def wrapper(*args, **kwargs):
variables = {}
func_args = signature(func).bind(*args, **kwargs).arguments
func_args = dict(func_args)
# print(func_args)
# to get values that are not passed and defautlt values
sig = signature(func)
for param in sig.parameters.values():
if ( param.default is not param.empty):
if param.name not in func_args:
if type(param.default) in [int, str, float, bool]:
func_args[param.name] = param.default
else:
if param.default == 0:
del func_args[param.name]
print(func_args)
variables = {**variables, **{key: value for key, value in func_args.items() if type(value) in [int, float, bool, str] and key not in variables}}
print(variables)
# return func(*args, **kwargs)
return wrapper
@dump_args
def test(a, b=4, e=0, c="blah-blah", d= 4.5, val=True):
pass
dic= {'name': 'sparsh'}
test(1, 'hola', dic, False)
輸出是這樣的: {'a': 1, 'b': 'hola', 'c': False, 'd': 4.5, 'val': True} {'a': 1, 'b': '你好','c':假,'d':4.5,'val':真}
我想要做的是當我把裝飾器放在下面的函式中時
@dump_args(b = stringvalue)
def test(a, b=4, e=0, c="blah-blah", d= 4.5, val=True):
pass
并呼叫此函式,然后在最終字典中,b鍵將被integervalue鍵替換,輸出應如下所示:
{'a': 1, 'stringvalue': 'hola', 'c': False, 'd': 4.5, 'val': True}
{'a': 1, 'stringvalue': 'hola', 'c': False, 'd': 4.5, 'val': True}
誰能告訴我該怎么做。提前致謝
uj5u.com熱心網友回復:
對于如何向裝飾器添加引數的基本問題,有很多 SO 問題和答案:帶引數的裝飾器?,如何將額外的引數傳遞給 Python 裝飾器?
在您的情況下,您可以將現有的裝飾器包裝在另一個接受關鍵字引數的層中,并且這些關鍵字引數將在您的內部包裝器的范圍內可用。這是一個更簡單的案例,與您的完整案例類似,它說明了我的意思:
def dump_factory(**dump_kwargs):
def dump_args(func):
def wrapper(**kwargs):
variables = kwargs
# check if any of the kwargs from the outer decorator
# have been set, and replace them here if so
for ky, val in dump_kwargs.items():
if ky in variables:
variables[ky] = val
return func(**variables)
return wrapper
return dump_args
@dump_factory(b=1)
def test(a =0, b=4, e=0, c="blah-blah", d= 4.5, val=True):
print(f" b = {b}")
test(b='a')
# b = 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/443855.html
標籤:Python python-3.x 装饰师 蟒蛇装饰器
