语法错误:关键字arg之后的非关键字arg

时间:2017-06-01 12:54:52

标签: python python-2.7 function

我在spyder中使用Python 2.7.13。

def test(a,b,c='c',*args):
    for item in args:
        print item

这个函数定义在Python 2.7中有效,但是一旦我尝试传入args它就会在关键字arg 错误之后给出非关键字arg:

test(1,2,c='c',10,11)

给出这个:

non-keyword arg after keyword arg

但是这个:

test(1,2,3,4,5)

正在工作。

自从*args c='c'

之后,我不确定这里的问题是什么
def test(a,b,*args,c='c'):
    for item in args:
        print item

这使我在函数定义中出错。

上面的代码只是一个虚拟示例,原始代码如下所示:

def export_plot_as_mat(fname, undersamp, undersamp_type, n_comp, b_s, n_iter, fit_alg, transf_alg, alpha_train, alpha_test, export_info=False, *args):

    info = ('undersampling=' + str(undersamp) + ' undersampling_type=' +str(undersamp_type) + 
        ' n_comp=' + str(n_comp) + ' batch_size=' + str(b_s) + 
        ' n_iter=' + str(n_iter) + ' fit_alg=' + str(fit_alg) + 
        ' transform_alg=' + str(transf_alg) + ' alpha_train=' + 
        str(alpha_train) + ' alpha_test=' + str(alpha_test))

    d = [(str(args[i]), args[i]) for i in range(len(args))]

    if export_info:
        d.append('info',info)
    sp.io.savemat(fname + '.mat', d)

我希望能够导出用于构建我正在导出的数据的参数。

3 个答案:

答案 0 :(得分:1)

定义很好,因为可以在位置指定c调用是问题所在;您在另一个位置参数之前指定了关键字参数。

Python 2.x没有办法定义仅限关键字的参数。

答案 1 :(得分:0)

这里有几件事。

将测试中的c = 'c'更改为'c'

你也可以将你的最后一个参数放在一个列表中,以便在同一行上打印它们。或者将它们保留为原样,将它们分开打印出来。

def test(a,b,c='c',*args):
    for item in args:
        print item

test(1,2,'c',[10,11])

结果:

[10, 11]

对于参数c = 'c',您可以传递任何您想要的内容,并与c进行互动:

举个例子:

def test(a,b,c='c',*args):
    print c
    for item in args:
        print item


test(1,2,'g',10,11)

结果:

g
10
11

答案 2 :(得分:0)

这是Python 2.x如何进行参数解析的一个有趣的侧面案例。粗略地说,Python有一些逻辑用于如何“匹配”传递给函数的参数和它期望的参数,并且这个逻辑在Python 3中发生了变化。

获得所需内容的最简单方法是接受**kwargs而不是指定c=0,并手动执行默认参数。