我以为我可以在Python 2的函数调用中在变长位置参数之后使用命名参数,但是SyntaxError在导入python类时得到了提示。例如,我正在使用以下“ get”方法编写:
SyntaxError
class Foo(object): def __init__(self): print "You have created a Foo." def get(self, *args, raw=False, vars=None): print len(args) print raw print vars
错误看起来像:
def get(self, *args, raw=False, vars=None): ^ SyntaxError: invalid syntax
我希望能够以几种方式调用该方法:
f = Foo() f.get(arg1, arg2) f.get(arg1, raw=True) f.get(arg1, arg2, raw=True, vars=something)
等等
它确实有效,但仅在Python 3中有效。请参阅PEP 3102。浏览“新功能”文档后,似乎没有2.x向后移植,因此您很不走运。您必须接受任何关键字参数(**kwargs)并手动对其进行解析。您可以使用d.get(k, default)getd[k]或default不存在的方法。要从中删除参数kwargs,例如,在调用超类的方法之前,请使用d.pop。
**kwargs
d.get(k, default)
d[k]
default
kwargs
d.pop
请注意,在和中def get(self, *args, raw=False, vars=None):,与关键字参数无关。这些是默认参数值。具有默认值的参数可以按位置传递,而没有默认值的参数可以通过关键字传递:raw=False``vars=None
def get(self, *args, raw=False, vars=None):
raw=False``vars=None
def f(a=1): pass f(2) # works, passing a positionally def f(a): pass f(a=2) # works, passing a by keyword
同样,仅关键字参数不需要具有默认值。在*args参数之后出现的是将它们标记为仅关键字,而不是默认值的情况:
*args
def f(*args, a): pass # a is a mandatory, keyword-only argument