函数参数中的星号是什么?
当我查看pickle模块时,我看到了这一点:(http://docs.python.org/3.3/library/pickle.html#pickle.dump)
pickle.dump(obj, file, protocol=None, *, fix_imports=True)
我知道在参数之前的单个和双星号(对于可变数量的参数),但这没有任何结果。而且我很确定这与泡菜无关。这可能就是这种情况的一个例子。当我把它发送给口译员时,我才知道它的名字:
>>> def func(*):
... pass
...
File "<stdin>", line 1
SyntaxError: named arguments must follow bare *
如果重要,我在python 3.3.0上。
答案 0 :(得分:166)
Bare *
用于强制调用者使用命名参数 - 因此,如果没有以下关键字参数,则无法使用*
定义函数。
有关详细信息,请参阅this answer或Python 3 documentation。
答案 1 :(得分:52)
虽然原始答案完全回答了问题,但只是添加了一些相关信息。单个星号的行为来自PEP-3102
。引用相关部分:
The second syntactical change is to allow the argument name to
be omitted for a varargs argument. The meaning of this is to
allow for keyword-only arguments for functions that would not
otherwise take a varargs argument:
def compare(a, b, *, key=None):
...
简单来说,这意味着要传递key的值,您需要将其显式传递为key="value"
。
答案 2 :(得分:7)
def func(*, a, b):
print(a)
print(b)
func("gg") # TypeError: func() takes 0 positional arguments but 1 was given
func(a="gg") # TypeError: func() missing 1 required keyword-only argument: 'b'
func(a="aa", b="bb", c="cc") # TypeError: func() got an unexpected keyword argument 'c'
func(a="aa", b="bb", "cc") # SyntaxError: positional argument follows keyword argument
func(a="aa", b="bb") # aa, bb
上面带有** kwargs的示例
def func(*, a, b, **kwargs):
print(a)
print(b)
print(kwargs)
func(a="aa",b="bb", c="cc") # aa, bb, {'c': 'cc'}
答案 3 :(得分:1)
我发现以下链接对解释*
,*args
和**kwargs
很有帮助:
https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/
基本上,除了上面的答案外,我还从上面的网站(信用:https://pythontips.com/author/yasoob008/)中学到了以下内容:
下面首先定义了演示功能,有两个示例,一个带有*args
,另一个带有**kwargs
def test_args_kwargs(arg1, arg2, arg3):
print "arg1:", arg1
print "arg2:", arg2
print "arg3:", arg3
# first with *args
>>> args = ("two", 3,5)
>>> test_args_kwargs(*args)
arg1: two
arg2: 3
arg3: 5
# now with **kwargs:
>>> kwargs = {"arg3": 3, "arg2": "two","arg1":5}
>>> test_args_kwargs(**kwargs)
arg1: 5
arg2: two
arg3: 3
因此,*args
允许您动态构建一个参数列表,该列表将按照它们被馈送的顺序进行处理,而**kwargs
可以启用NAMED参数的传递,并且可以由相应地使用NAME(与它们的投放顺序无关)。
站点继续,并指出参数的正确顺序应为:
some_func(fargs,*args,**kwargs)
答案 4 :(得分:1)
假设您具有以下功能:
def sum(a,key=5):
return a + key
您可以通过两种方式调用此函数:
sum(1,2)
或sum(1,key=2)
假设您希望仅使用关键字参数来调用函数sum
。
您将*
添加到函数参数列表中以标记位置参数的结尾。
因此函数定义为:
def sum(a,*,key=5):
return a + key
只能使用sum(1,key=2)
答案 5 :(得分:1)
在语义上,这意味着其后的参数仅是关键字,因此,如果尝试在不指定名称的情况下尝试提供参数,则会出现错误。例如:
>>> def f(a, *, b):
... return a + b
...
>>> f(1, 2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: f() takes 1 positional argument but 2 were given
>>> f(1, b=2)
3
实用上,这意味着您必须使用关键字参数来调用该函数。如果没有参数名称给出的提示,很难理解参数的目的,通常会这样做。
比较例如sorted(nums, reverse=True)
与您是否写过sorted(nums, True)
。后者的可读性要差得多,因此Python开发人员选择让您以前一种方式进行编写。