python *args 和 **kwargs

python *args and **kwargs

我看过之前有关此主题的堆栈溢出帖子,但是当我尝试 运行 我的函数时,仍然无法创建使用这两个命令。我已经编写了一个简单移动平均线的演示示例,我想通过 args,kwargs 命令 运行。

import numpy as np
def moving_average(data,lookback=7,SMA=True): #MA function
    if SMA==True:
        weights=np.repeat(1.0,lookback)/lookback
        smas=np.convolve(data,weights,'valid')
        return smas

只需运行使该功能按预期工作即可。

data=np.random.randn(100) #randomly 
moving_average(data,lookback=7,SMA=True) #this outputs the correct set of numbers

然而,第二次我尝试添加 args 和 kwargs 它崩溃了。

def test1(*args,**kwargs):
    return moving_average(data,lookback,SMA)
test1(data,lookback=7,SMA=True) #this returns an error, saying my global lookback is not defined

我在 *args **kwargs 逻辑中到底错了什么?我尝试同时输入元组和字典,但似乎都不起作用。

*args**kwargs 传递给您的函数,而不是参数和命名参数:

def test1(*args,**kwargs):
    return moving_average(*args, **kwargs)

在您使用 *args 和 **kwargs 的示例中:

def test1(*args,**kwargs):
    return moving_average(data,lookback,SMA)

datalookbackSMA 不再定义。可能是:

def test1(*args, **kwargs):
    return moving_average(args[0], kwargs['lookback'], kwargs['SMA'])

def test1(*args, **kwargs):
    return moving_average(*args, **kwargs)

Python 教程中有一个部分可能会有所帮助:Unpacking Argument Lists

def test1(*args,**kwargs):

您的函数现在有两个局部变量,argskwargs。一个保存传入的位置参数(作为元组),另一个保存关键字参数(作为字典)。

return moving_average(data,lookback,SMA)

这里你使用了函数中不存在的三个变量名(data、lookback 和 SMA),所以会出错。

你本来可以做到的

return moving_average(args[0], kwargs['lookback'], kwargs['SMA'])

但是你的 test1 函数将只适用于像 test1(data,lookback=7,SMA=True) 这样的精确调用。像test1(data, 7, True)这样的调用是行不通的,因为参数都在args,none在kwargs).

您的函数也可以完全按照接收到的参数传递参数:

return moving_average(*args, **kwargs)

可以,但是test1函数没有任何好处,它只是调用moving_average和returns它的结果,为什么不直接调用moving_average

您可以在 PyMentor python 中了解 args 和 kwargs。希望对大家有所帮助。

how to understand args and kwargs in python