在python中如何使用decorator向函数发送参数

2024-09-30 08:19:03 发布

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

我在python中有一组函数,它们获得相同的2个参数+其他参数。在

def myMethodA (param1, param2, specificParm)
    do code

 def myMethodB (param1, param2, specificParm1 specificParam2)
    do code

我想创建一个decorator,通过在调用函数之前推送参数,用前2个参数替换调用的需要:

^{pr2}$

但是如果我省略了参数,那么decorator也不能调用它,如果我离开它们,那么调用者也需要指定它们。在

不管怎样解决这个问题? 我能用args*做些什么吗?但仍然有specificParam的命名参数? 另外,如何在myMethodA中引用param1和param2


Tags: 函数参数defcodedecoratordoparam1调用函数
3条回答

我建议你还是老派,用^{}重新分配名字:

# module foo

def func1(common_1, common_2, specific_1):
    pass

def func2(common_1, common_2, specific_2, specific_3):
    pass

然后在其他地方(或文件中的较低位置,如果您愿意)可以执行以下操作:

^{pr2}$

听起来你可能想要functools.partial。它返回一个新函数,其中一些参数已经指定:

import functools

def withParams(func):
    return functools.partial(func,1,2)

@withParams
def myMethodA (param1, param2, specificParam):
    print(param1,param2,specificParam)

@withParams
def myMethodB (param1, param2, specificParam1, specificParam2):
    print(param1,param2,specificParam1, specificParam2)

myMethodA(10)
myMethodB(12,13)
1 2 10
1 2 12 13

当您调用decorator包装器函数中的函数作为kwargs的一部分时,可以添加这两个参数。在调用之前,所有修饰函数都会自动将这两个参数作为关键字参数传递:

def withParams(func):
    def wrapper(*args, **kwargs):
        kwargs['param1'] = 1
        kwargs['param2'] = 2
        return func(*args, **kwargs)
    return wrapper

@withParams
def add(specificparam, *args, **kwargs):
      print(specificparam)  # 3
      print(args)           # (4,)
      print(kwargs)         # {'param2': 2, 'param1': 1}
      return specificparam + sum(args) + sum(kwargs.values())

print(add(3,4)) # 10

如果从主函数调用中传递的是每个函数的特定参数,则可以删除args部分。在

相关问题 更多 >

    热门问题