![](/img/trans.png)
[英]Neatly pass positional arguments as args and optional arguments as kwargs from argparse to a 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.