Python:函数最多接受4个参数(给了5个)

0 投票
3 回答
8904 浏览
提问于 2025-04-18 14:35

我的函数是用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

很可能你在这里多打了一个*,因为在命名可选的位置参数时,我们通常用*args,而命名的可选参数则用**kwargs

所以你的函数实际上可以接受4个位置参数和任意数量的关键字参数。如果你这样调用它:

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

要解决这个问题,你很可能需要去掉第二个星号。

1

当你说 **args 是传入函数的一组对象 时,这里的 * 是单个的。

如果你在定义一个函数时用 **args 作为参数之一,当你尝试传递键值对时,它会出错,因为无法正确拆分。

**kwargs 是用来和 字典 对应的。

*args 是用来和 列表 对应的。

你也可以同时使用这两者,如下所示:

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

使用 *args,而不是 **kwargs(或者 **任何东西),或者用参数名称来调用函数。这会让你得到一个可变数量的参数列表,你可以像提取ID那样去遍历它们。

参数 必须 通过名称来指定,以便应用到 **kwargs,而不是通过参数的数量。


查看 *args 和 **kwargs?

当你不确定会有多少个参数传递给你的函数时,你会 使用 *args,也就是说,它允许你传递任意数量的参数给你的函数。同样,**kwargs 让你处理那些你没有提前定义的命名参数

撰写回答