Python:函数最多需要4个参数(给定5个)

时间:2014-07-24 10:56:19

标签: python function parameters

我的功能如下使用python:

def PlotCurve(SourceClipName,mode,TestDetails,savepath='../captures/',**args):

    curves=[]
    for a in range(0,len(args)):
        y=[]
        for testrates in TestDetails.BitratesInTest:

            stub = args[a].Directory[testrates]
            y.append(args[a].DataSet[stub][0])
            curves.append(y)

    plt.figure()
    plt.xlabel("Bitrate")
    plt.ylabel(mode)
    plt.title(TestDetails.HDorSD+" "+TestDetails.Codec + " " + SourceClipName[:-4])
    colour=["green","red","brown","orange","purple","grey","black","yellow","white",]
    CurveIDs=[]
    for x in args:
        CurveIDs.append(args.ID)
    p=[]    
    for b in range(0,len(args)-1):
        p[b].plot(TestDetails.BitratesInTest,y[b],c=colour[b])

    plt.legend((p),(CurveIDs),prop={"size":8})
    plt.savefig(os.path.join(savepath,mode+"_"+TestDetails.codec+"_"+SourceClipName[:-4]+".png"))

具体错误是

TypeEror: PlotCurve() takes at most 4 arguments (5 given)

**args是已传递到函数

的对象列表

在我看来,我已经定义了一个接受5个或更多参数的函数(无论它是否正常工作),但程序不同意,我错过了什么让函数认为它只能有最多4个参数?

3 个答案:

答案 0 :(得分:1)

当您说**args is a list of objects that has been passed into the function时,那就是单*

当您定义一个函数**args作为参数之一时,它将无法解压缩,而您传递键值对

要与**kwargs

进行映射的

dictionary 要与*args

进行映射的

list

或者你可以同时拥有它们,

>>> def func(argone, *args, **kwargs):
>>>    # do stuff
>>>
>>> func(1, *[1, 2, 3, 4])
>>> func(1, *[1, 2, 3, 4], **{'a': 1, 'b': 2})
>>>

答案 1 :(得分:0)

使用*args,而非**kwargs(或**anything),使用参数名称调用该函数。这将导致溢出参数的可变列表,然后可以像提取的那样迭代以提取ID。

必须指定参数以应用于**kwargs,而不是参数计数。


请参阅*args and **kwargs?

  

如果您不确定可以向您的函数传递多少个参数,您将使用* args,即它允许您向函数传递任意数量的参数。同样, ** kwargs允许您处理未事先定义的命名参数

答案 2 :(得分:0)

最有可能是双重*,因为命名可选位置参数的便利性是*args,可选的命名参数是**kwargs

因此,您的函数实际上接受4个位置参数和任意数量的keyword arguments。如果你这样称呼它:

PlotCurve(1,2,3,4,5) # you should get error
PlotCurve(1,2,3,4,aaa=5) # you should have args = {'aaa': 5}

要解决此问题,您很可能需要删除第二颗星。