2017-06-01 66 views
0

我在spyder中使用Python 2.7.13。语法错误:关键字arg后的非关键字arg

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 bfore 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) 

我希望有出口用于构建我导出数据的参数选项。

+0

更改顺序:'test(1,2,10,11,c ='c')'。 Python会做正确的事情,并在'* args'中收集所有非关键字参数。 – Boldewyn

+0

@Boldewyn这可能工作在python 3.x,但在Python 2.7这给了我错误'测试()有多个值的关键字参数'c'' –

+0

@PedrovonHertwig我希望参数有不同的大小,所以这就是为什么我只是不要传递一个常规参数 –

回答

1

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

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

+0

相矛盾,将* args放在关键字之前会在函数定义中产生错误 –

+0

是的,那是第二个错误。它并没有改变第一个定义是好的事实。 – chepner

+0

无论您如何在Python 2.x中定义'test',像'test(1,2,c = 3,4,5)'这样的调用都是非法的;您不能在关键字参数之后指定位置参数。 – chepner

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 
+0

我想指定'c'作为c ='c'来查看'c'分配的内容 –

+0

你能多一点明确这一点?你是什​​么意思,看看分配了什么'c'。也许在'='两边使用一个不是'c'的例子,这样我就能理解你需要什么。 –

+0

在更新后的问题中,参数是'export_info = False',因此在函数调用中它可以被显示,也可以导出信息或者仅仅输出参数。只是传递'True'或'False'不可读imo –

0

这是Python 2.x如何进行参数解析的一个有趣的案例。粗略地说,Python具有一些逻辑,用于将传递给函数的参数与它所期望的参数进行“匹配”,并在Python 3中更改此逻辑。

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

+0

我认为这是一个解决方案,但最终它有点难看。定义与上述函数调用本身 –

相关问题