繁体   English   中英

为什么在用 arguments 定义为 *args 和 **kwargs 的 function 中传递参数不是强制性的?

[英]Why is it not a mandate to pass parameters in a function defined with arguments as *args and **kwargs?

我定义了一个 function 如下:

def func_tion(*args, **kwargs):
  
    print("hola")

func_tion()

输出/输出:

hola

为什么这不显示任何错误?

*args**kwargs是可选的吗?

语法是*** 名称*args**kwargs只是按照惯例,但没有硬性要求使用它们。

You would use *args when you're not sure how many arguments might be passed to your function, ie it allows you pass an arbitrary number of arguments to your function. 例如:

>>> def print_everything(*args):
        for count, thing in enumerate(args):
...         print( '{0}. {1}'.format(count, thing))
...
>>> print_everything('apple', 'banana', 'cabbage')
0. apple
1. banana
2. cabbage

同样, **kwargs允许您处理您未事先定义的命名 arguments:

>>> def table_things(**kwargs):
...     for name, value in kwargs.items():
...         print( '{0} = {1}'.format(name, value))
...
>>> table_things(apple = 'fruit', cabbage = 'vegetable')
cabbage = vegetable
apple = fruit

您也可以将它们与命名为 arguments 一起使用。 显式 arguments 首先获取值,然后将其他所有内容传递给*args**kwargs 命名为 arguments 在列表中排在首位。 例如:

def table_things(titlestring, **kwargs)

您也可以在同一个 function 定义中使用两者,但*args必须出现在**kwargs之前。

您还可以在调用 function 时使用***语法。 例如:

>>> def print_three_things(a, b, c):
...     print( 'a = {0}, b = {1}, c = {2}'.format(a,b,c))
...
>>> mylist = ['aardvark', 'baboon', 'cat']
>>> print_three_things(*mylist)
a = aardvark, b = baboon, c = cat

正如您在这种情况下所看到的,它获取项目列表(或元组)并将其解包。 这样,它将它们与 function 中的 arguments 匹配。 当然,您可以在 function 定义和 function 调用中都有一个*

文档(强调我的):

如果存在“ *identifier ”形式,则将其初始化为接收任何多余位置参数的元组,默认为空元组。 如果存在“ **identifier ”形式,则将其初始化为接收任何多余关键字 arguments的新有序映射,默认为相同类型的新空映射。

“任何多余”可以包括“没有多余”,这意味着两种形式都没有强加必需的参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM