函数参数中是否只有星号?

Eri*_*ric 204 python parameter-passing python-3.x

函数参数中的星号是什么?

当我查看pickle模块时,我看到了这一点:(http://docs.python.org/3.3/library/pickle.html#pickle.dump)

pickle.dump(obj, file, protocol=None, *, fix_imports=True)
Run Code Online (Sandbox Code Playgroud)

我知道在参数之前的单个和双星号(对于可变数量的参数),但这没有任何结果.而且我很确定这与泡菜无关.这可能就是这种情况的一个例子.我把它发送给翻译时我才知道它的名字:

>>> def func(*):
...     pass
...
  File "<stdin>", line 1
SyntaxError: named arguments must follow bare *
Run Code Online (Sandbox Code Playgroud)

如果重要的话,我在python 3.3.0上.

Kim*_*ais 192

Bare *用于强制调用者使用命名参数 - 因此*当您没有以下关键字参数时,不能将函数定义为参数.

有关更多详细信息,请参阅此答案Python 3文档.

  • @BallpointBen:“*”代替“*args”,反之亦然;它们不能共存于一个签名中。这就是为什么他们选择“*”;以前,“*args”是强制纯位置参数的唯一方法,它标记了“可以”按位置传递的参数的结尾(因为它收集了所有剩余的位置参数,它们可以到达以下命名参数)。`*` 意味着同样的“位置参数不能超出这里”,但是缺少名称意味着“但我根本不会接受它们,因为我选择不提供放置它们的地方”。 (9认同)
  • 请注意,所有位置(未命名)参数,包括 `*args`,都必须出现在裸露的 `*` 之前。 (3认同)
  • 还要注意,有一种对应物/,它标志着仅位置参数的结束(/sf/ask/1977068271/ -a-python的方法签名,作为秀). (2认同)
  • 但是为什么 `def foo(a, *, **kwargs)` 返回相同的语法错误? (2认同)

mu *_*u 無 62

虽然原始答案完全回答了问题,但只需添加一些相关信息.单个星号的行为来自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):
        ...
Run Code Online (Sandbox Code Playgroud)

简单来说,这意味着要传递key的值,您需要明确地传递它key="value".

  • @Stephen我最初也认为,裸`*`的效果是吞噬剩余的位置参数,但事实并非如此.传递比函数期望更多的位置参数,会产生这样的错误:`foo()只需要1个位置参数(给定2个)` (5认同)
  • 哦,这样事情就清楚多了。所以实际上有一个参数 * 就像有一个参数 args*,但是由于你没有给它命名任何东西,它唯一的作用可能是悄悄地吞噬所有剩余的位置参数,以强制剩余的参数成为关键字-只要。 (2认同)

kay*_*ya3 17

从语义上讲,这意味着它后面的参数只有关键字,所以如果你试图提供一个参数而不指定它的名字,你会得到一个错误。例如:

>>> 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
Run Code Online (Sandbox Code Playgroud)

实际上,这意味着您必须使用关键字参数调用该函数。如果没有参数名称给出的提示,很难理解参数的目的,通常会这样做。

比较例如sorted(nums, reverse=True)与如果你写的sorted(nums, True)。后者的可读性要差得多,因此 Python 开发人员选择让您以前者的方式编写它。


rok*_*rok 12

假设你有函数:

def sum(a,key=5):
    return a + key 
Run Code Online (Sandbox Code Playgroud)

您可以通过两种方式调用此函数:

sum(1,2) 或者 sum(1,key=2)

假设您希望sum仅使用关键字参数调用函数。

您添加*到函数参数列表以标记位置参数的结尾。

所以函数定义为:

def sum(a,*,key=5):
    return a + key 
Run Code Online (Sandbox Code Playgroud)

只能使用 sum(1,key=2)


lay*_*cat 11

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
Run Code Online (Sandbox Code Playgroud)

上面带有** kwargs的示例

def func(*, a, b, **kwargs):
    print(a)
    print(b)
    print(kwargs)

func(a="aa",b="bb", c="cc") # aa, bb, {'c': 'cc'}
Run Code Online (Sandbox Code Playgroud)