我在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)
我希望能够导出用于构建我正在导出的数据的参数。
答案 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
,并手动执行默认参数。