更新目标为可调用的args和kwargs的值。
argupdate的Python项目详细描述
argupdate
此包用于更新目的地为的args/kwargs中的值 功能。这对于那些想要 修改传递到修饰函数的值。
通过反省args/kwargs的功能,它知道 你的args中所有参数的名称(当然还有你的kwargs 这是一个口述)。因此,您可以提供更新的值 根据参数的名称。
通过接受一个特殊的callable,我们还提供了一种动态地 在运行时更新参数的值。
简单示例
我们要修改
的值的函数fromtypingimportOptionaldeffoo(arg_1:int,arg_2:bool,arg_3:Optional[str]=None)->None:print(arg_1,arg_2,arg_3)
假设出于某种原因,我们总是希望arg_2
是False
,不
不管打电话的人是怎么进来的。
importfunctoolsfromargupdateimportupdate_parameter_valuefromtypingimportOptionaldefarg_2_always_false(func):# This is the new value for `arg_2`updated_values={'arg_2':False}@functools.wraps(func)defwrapper(*args,**kwargs):# Here we update the value.updated_args,updated_kwargs=update_parameter_value(func,updated_values,args,kwargs)returnfunc(*updated_args,**updated_kwargs)returnwrapper@arg_2_always_falsedeffoo(arg_1:int,arg_2:bool,arg_3:Optional[str]=None)->None:print(arg_1,arg_2,arg_3)
无可否认,这是一个人为的例子。你可以设置
在args
到False
中的第二个参数,不使用此库。但是,
即使在这个做作的小例子中,通过
使用argupdate
。只要参数的名称保持不变,
您不必指望它是
参数列表。
更高级的示例
您还可以使用一个特殊的callable作为新值。这样你就可以 根据函数和其他函数的签名设置新值 参数的值。
下面是一个实际项目的例子。这个项目结束了
多个其他后端库。这些库都有方法
以handle
参数作为int
。除了一个。这个图书馆
需要handle
参数作为类似于
[HANDLE:0x0000001]
。
而不是到处重复代码来检查 如果我们过去了,我们就创造了一个为我们做这件事的装饰师。
importfunctoolsimportinspectfromtypingimportAny,Mapping,Sequencefromargupdateimportupdate_parameter_value,ValueUpdaterfromutilsimportstringify_intdefhandle_stringifier(func):classupdate_handle(ValueUpdater):def__call__(self,original_value:Any,signature:inspect.Signature,orig_args:Sequence[Any],orig_kwargs:Mapping[str,Any])->Any:ifisinstance(original_value,int):returnstringify_int(int)returnoriginal_valueupdated_values={# update_handle will be used to create the value for the argument# called `handle`'handle':update_handle}@functools.wraps(func)defwrapper(*args,**kwargs):updated_args,updated_kwargs=update_parameter_value(func,updated_values,args,kwargs)returnfunc(*updated_args,**updated_kwargs)returnwrapper@handle_stringifierdefweird_handle_taker(handle:int)->None:...