Python:使用d修改函数的内部行为

2024-10-04 09:30:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习使用python decorator。在

def my_dcrtr(fun):
    def new_fun():
        return fun()
    return new_fun

我意识到装饰函数'fun'在decorator中就像一个黑盒子。我可以选择在new\u fun中使用fun()或根本不使用。但是,我不知道我是否可以进入“fun”并在新的fun内与fun的本地范围进行交互?在

例如,我试图用python进行一个玩具远程过程调用(RPC)。在

^{pr2}$

在本例中,我尝试在运行时使用“locals()”命令获取rpc_fun的参数列表。然后发送到服务器执行。不是让rpc_fun返回它的locals(),是否可以使用decorator来检索修饰函数的参数空间?在


Tags: 函数new参数returnmydef装饰decorator
1条回答
网友
1楼 · 发布于 2024-10-04 09:30:21

您可以对Python3使用函数注释:

def return_locals_rpc_decorator(fun):
   def decorated_fun(*args, **kw):
      local_args = fun(*args, **kw) 
      print(local_args)
      fun_parameters = fun.__annotations__
      final_parameters = {a:list(args)[int(b[-1])-1] for a, b in fun_parameters.items() if a != 'return'}
      return final_parameters
   return decorated_fun

@return_locals_rpc_decorator
def my_funct(a:"val1", b:"val2", c:"val3") -> int:
    return a + b + c

print(my_funct(10, 20, 30))

输出:

^{pr2}$

这样,您就可以使用包装器函数decorated_fun来访问修饰函数的参数和注释指定的进一步信息。我更改了注释中的参数描述,以便每个字符串值都以一个数字结尾,该数字可用于索引args。但是,如果不想更改注释中的参数说明,可以通过结束字符进行排序。在

编辑:在包装器函数(decorated_fun)中调用时,my_funct体中的代码将被传递到{}范围内声明的args,并在{}中解包。在

相关问题 更多 >