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)
data
、lookback
和 SMA
不再定义。可能是:
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):
您的函数现在有两个局部变量,args
和 kwargs
。一个保存传入的位置参数(作为元组),另一个保存关键字参数(作为字典)。
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。希望对大家有所帮助。
我看过之前有关此主题的堆栈溢出帖子,但是当我尝试 运行 我的函数时,仍然无法创建使用这两个命令。我已经编写了一个简单移动平均线的演示示例,我想通过 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)
data
、lookback
和 SMA
不再定义。可能是:
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):
您的函数现在有两个局部变量,args
和 kwargs
。一个保存传入的位置参数(作为元组),另一个保存关键字参数(作为字典)。
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。希望对大家有所帮助。