函数的定义如下:
def testf(t,t1 = 0,*x):
... print t
... print t1
... print x[0]
... return sin(x[0]*t*t1)
...
我将函数称为testf(pi,t1 = 1,1)。我收到的错误是
SyntaxError: non-keyword arg after keyword arg
函数调用有什么问题吗?
如果我调用函数testf(t1=1,t=pi,1)
,我收到了同样的错误
如果我调用函数testf(pi,1,1)
,我将不会收到错误消息。
我有另一个关于调用此函数的问题。
可以使用默认值t1
和x
调用函数,该函数不是None,作为元组?
非常感谢你的帮助。
答案 0 :(得分:5)
在你的功能中,
t
是位置参数
t1
是一个关键字参数,带有默认值(也是位置1的位置参数)
x
是所有其他位置参数的集合
正如错误消息所示,任何Python函数都应该在任何关键字参数之前包含所有位置变量。你必须调用这个函数
testf(math.pi, t1=1)
当你传递一个关键字参数时,它应该是函数的最后一个参数(或者只有关键字参数可以跟随它)。
当你说
时testf(math.pi, 1, t1 = 2)
1
和2
都要分配给t1
(t1
也是索引1处的位置变量),这是不可能的。因此,在这种情况下也会抛出错误。
def testf(t, t1 = 0, *x):
print t, x, t1
testf(5)
# 5 () 0 -> `t` is 5, `t1` takes the default value, `x` is empty
testf(5, 10, 15, 20)
# 5 (15, 20) 10 -> `t` is 5, `t1` is 10, `x` is 15 and 20
testf(5, t1 = 20)
# 5 () 20 -> `t` is 5, `t1` is 20, `x` is empty
testf(5, 10, t1 = 20)
# TypeError: testf() got multiple values for keyword argument 't1'
testf(5, t1 = 20, 10)
# SyntaxError: non-keyword arg after keyword arg
答案 1 :(得分:0)
您应该在关键字参数
之前提供非关键字参数testf(pi,1,t1=1)
使用args和关键字args的一些示例:
def testf(t,*x,**keywords):
t1=keywords['t1'] if 't1' in keywords else 0
print t,x,keywords,t1
testf(1,5,t1=1)
testf(1,2,3,4)
testf(1,5)
testf(1)
将输出
1 (5,) {'t1': 1} 1 <---- t1 = 1
1 (2, 3, 4) {} 0 <---- t1 = 0
1 (5,) {} 0
1 () {} 0
答案 2 :(得分:0)
位置参数必须对应于函数的第一个n
参数,其中n
是提供的位置参数的数量。你不能将关键字参数与它们混合在一起;关键字参数必须在所有位置参数之后。
从理论上讲,语言可能是以其他方式设计的,但在这种情况下,位置论证意味着什么会令人困惑,并且激励增加的复杂性没有任何好处。例如,目前还不清楚是否在
def f(a=1, b=1, c=1): pass
f(c=1, 2)
2
应该提供a
或b
的值。
如果您想呼叫您的功能,请提供t1
位置:
testf(pi, 1, 1)
请注意,参数的默认值(例如t1
)的存在与否不会影响您是否可以将其作为关键字参数或位置参数提供。