当前位置: 首页 > 知识库问答 >
问题:

函数参数中的裸星号?

彭霄
2023-03-14

函数参数中的星号有什么作用?

当我查看pickle模块时,我看到:

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。

共有3个答案

尉迟远
2023-03-14
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'}
暴招
2023-03-14

而最初的答案完全回答了这个问题,只是添加了一点相关信息。单个星号的行为来自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”传递。

戎元忠
2023-03-14

Bare*用于强制调用方使用命名参数-因此,当您没有以下关键字参数时,您无法将带有*的函数定义为参数。

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

 类似资料:
  • 问题内容: 函数参数中的星号有什么作用? 当我查看pickle模块时,我看到了: 我知道在参数之前(对于可变数量的参数)之前的单星号和双星号,但是在此之前没有。而且我很确定这与泡菜无关。那可能只是这种情况的一个例子。我将其发送给翻译人员时才知道它的名字: 如果重要的话,我使用的是python 3.3.0。 问题答案: 用于强制调用方使用命名参数-因此,如果没有以下关键字参数,则无法将函数定义为参数

  • 本文向大家介绍Python 带星号(* 或 **)的函数参数详解,包括了Python 带星号(* 或 **)的函数参数详解的使用技巧和注意事项,需要的朋友参考一下 1. 带默认值的参数 在了解带星号(*)的参数之前,先看下带有默认值的参数,函数定义如下: (1)带默认值的参数(defaultStr、defaultNum)不传参时的调用: (2)带默认值的参数(defaultStr、defaultN

  • 本文向大家介绍PowerShell函数参数用星号隐藏的方法,包括了PowerShell函数参数用星号隐藏的方法的使用技巧和注意事项,需要的朋友参考一下 本文介绍在PowerShell中创建函数时,如何让函数的参数输入值的时候自动变成星号。 什么叫自动变成星号呢?举个例子,我们在登录一个邮箱时,输入用户时看到的是明文的,但我们在输入密码时,看到的是一个个增加的星号。在使用PowerShell自定义函

  • 问题内容: 我正在使用itertools.chain以这种方式“拉平”列表列表: 这跟说的有什么不同? 问题答案: 是“ splat”运算符:它接受一个列表作为输入,并将其扩展为函数调用中的实际位置参数。 所以如果是,那就等于说 这与传递just显然不同。对于您的情况,您有一个想要拼合的列表列表;什么确实是在所有你传递给它的位置参数,其中每个位置参数是在自己的权利迭代拼接返回一个迭代。 换句话说,

  • 问题内容: 我正在使用以这种方式“拉平”列表列表: 这跟说的有什么不同? 问题答案: 是“ splat”运算符:它接受一个列表作为输入,并将其扩展为函数调用中的实际位置参数。 所以如果,那就 这与传递just显然不同。对于你的情况,你有一个要拼合的列表列表;什么确实是在所有你传递给它的位置参数,其中每个位置参数是在自己的权利迭代拼接返回一个迭代。 换句话说,你希望将每个列表作为参数传递给,这会将它

  • 按值传递 Lua 函数的参数大部分是按值传递的。值传递就是调用函数时,实参把它的值通过赋值运算传递给形参,然后形参的改变和实参就没有关系了。在这个过程中,实参是通过它在参数表中的位置与形参匹配起来的。 示例代码: local function swap(a, b) --定义函数swap,函数内部进行交换两个变量的值 local temp = a a = b b = temp