改变函数内部函数参数的python方法

改变函数内部函数参数的python方法,python,function,arguments,Python,Function,Arguments,假设我在一个函数中有一个整型参数列表,我想给每个整型参数加1。有没有一种干净的方法可以做到这一点,比如伪代码: def foo(a, b, c): for argument in arguments: argument += 1 ... 特别是,我希望避免在代码中显式引用这些参数中的每一个,而只是迭代所有参数。将函数参数仅更改为一个列表不是一个选项,因为a、b、c在代码中具有特定的含义。使用显式引用 一种干净的方法可能是使用iterable解包和映射,如: de

假设我在一个函数中有一个整型参数列表,我想给每个整型参数加1。有没有一种干净的方法可以做到这一点,比如伪代码:

def foo(a, b, c):
    for argument in arguments:
        argument += 1
    ...
特别是,我希望避免在代码中显式引用这些参数中的每一个,而只是迭代所有参数。将函数参数仅更改为一个列表不是一个选项,因为
a、b、c
在代码中具有特定的含义。

使用显式引用 一种干净的方法可能是使用iterable解包和映射,如:

def foo(a,b,c):
    a,b,c = map(lambda x:x+1,(a,b,c))
    # ...
或四舍五入:

 def foo(a,b,c):
     a,b,c = map(round,(a,b,c))
     # ...
因为这仍然是显式的,并且将参数保留在
foo
的函数签名中

当然,您可以使用
*args
**kwargs
并(直接)操作这些参数,但这可能会导致丢失有关参数
a
b
c
的含义(其语义)的信息

使用装饰器(对所有参数应用该函数) 另一种删除参数语义的方法是使用decorator:

然后您可以将装饰器放在
foo
上,如:

现在如果调用
foo(1.4,1.3,1.9)
foo
将获得
(a,b,c)==(1,1,2)
。例如,如果要打印
a
b
c

>>> def apply_func_args(func):
...     def dec(f):
...         def g(*args,**kwargs):
...             return f(*map(func,args),**{k:func(v) for k,v in kwargs.items()})
...         g.__name__ = f.__name__
...         g.__doc__ = f.__doc__
...         return g
...     return dec
... 
>>> @apply_func_args(round)
... def foo(a,b,c):
...     print((a,b,c))
... 
>>> foo(1.4,1.3,1.9)
(1, 1, 2)
>>> foo(1.4,2.5,c=0)
(1, 2, 0)
>>> foo(b=1.4,a=2.5,c=0)
(2, 1, 0)
因此,这里我们定义了一种干净的方法,将函数(
round
)应用于
foo
的所有命名和未命名参数。因此,如果我们调用
foo
foo
将始终获得四舍五入的值

def foo(a, b, c):
    return call_other(round(a),round(b),round(c))


我想如果我明白你想做什么。。。(阅读评论)

以下是一个没有副作用的例子:

a = [1, 2, 3, 4]
b = [5, 6, 7, 8]
c = [9, 8, 7, 6]
def foo(*args):
    modified = list()
    for idx, arg in enumerate(args):
        modified.append([x + 1 for x in arg])
    print modified
    # do something else

# In [17]: foo(a, b, c)
# [[2, 3, 4, 5], [6, 7, 8, 9], [10, 9, 8, 7]]

使用此实现,您可以输入任意数量的数组。

如果您希望在函数之外产生任何影响,您需要仔细阅读。在我的情况下,我并不真正关心函数之外的值。但是,您将如何使用这些值?由于整数是不可变的,你不能简单地改变你调用的变量,那么你的目标是什么?如果你能解释一下你试图解决的真正问题是什么,这会有帮助的,在这里,你试图这样做?这是对我的实函数的简化,答案与用法无关。为了完整性,我需要在调用另一个函数之前对这些值进行四舍五入。我无法在调用
foo
的函数中执行此操作,因为我无法控制该代码库。我发布此问题的主要原因是避免显式引用每个参数。我关心的是一种干净的方法,而不是多次提到函数
round()
和变量
a、b、c
。显式优于隐式这可以在不显式引用每个参数的情况下实现吗?我尝试将for循环与
*args
**kwargs
一起使用,但两者在语法上都不正确。@DaniyalShahrokhian:是的,您可以使用decorator,如演示的那样。这将把函数应用于所有参数。非常完整的答案@Willem。我认为,若并没有更简单的实现,我将使用显式引用。我希望在python中有一种方法可以引用类似于我的伪代码的函数参数,但我认为仅仅对一个函数使用decorator似乎有些过分了。@DaniyalShahrokhian:当然,你可以重用decorator。此外,我认为您仍然必须明确您正在做什么(不是通过引用变量本身,但应该清楚发生了什么)。这种解决方案将破坏函数的可读性,因为参数不再有意义。我修改了我的问题,以反映参数不仅仅是无意义的整数。
def foo(a, b, c):
    return call_other(round(a),round(b),round(c))
def foo(a, b, c):
    return call_other(a+1,b+1,c+1)
a = [1, 2, 3, 4]
b = [5, 6, 7, 8]
c = [9, 8, 7, 6]
def foo(*args):
    modified = list()
    for idx, arg in enumerate(args):
        modified.append([x + 1 for x in arg])
    print modified
    # do something else

# In [17]: foo(a, b, c)
# [[2, 3, 4, 5], [6, 7, 8, 9], [10, 9, 8, 7]]