Python *args, **kwargs 的用法和用处

在 stackoverflow 上看到了对 *args和**kargs 比较好的解释,分享一下,顺便补充一些例子
def func(required_arg, *args, **kwargs):
    # required_arg is a positional-only parameter.
    print(required_arg)

    # args is a tuple of positional arguments,
    # because the parameter name has * prepended.
    if args: # If args is not empty.
        print(args)

    # kwargs is a dictionary of keyword arguments,
    # because the parameter name has ** prepended.
    if kwargs: # If kwargs is not empty.
        print(kwargs)

>>> func()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func() takes at least 1 argument (0 given)

>>> func("required argument")
required argument

>>> func("required argument", 1, 2, '3')
required argument
(1, 2, '3')

>>> func("required argument", 1, 2, '3', keyword1=4, keyword2="foo")
required argument
(1, 2, '3')
{'keyword2': 'foo', 'keyword1': 4}

>>> func("required argument", 1, keyword1=4, 2, '3',keyword2="foo")
  File "<ipython-input-24-92187cb5dc7e>", line 1
    func("required argument", 1, keyword1=4, 2, '3',keyword2="foo")
                                            ^
SyntaxError: positional argument follows keyword argument
# 说明参数的顺序不能乱


>>> func(required_arg="required argument", 1, 2, '3', keyword1=4 ,keyword2="foo")
  File "<ipython-input-30-de2b4309d741>", line 1
    func(required_arg="required argument", 1, 2, '3', keyword1=4 ,keyword2="foo")
                                          ^
SyntaxError: positional argument follows keyword argument
# 说明第一个参数只能是positional arg, 不能指定名称

>>> func(1, 2, '3', required_arg="required argument", keyword1=4 ,keyword2="foo")
Traceback (most recent call last):

  File "<ipython-input-28-12444e9d53db>", line 1, in <module>
    func(1, 2, '3', required_arg="required argument", keyword1=4 ,keyword2="foo")

TypeError: func() got multiple values for argument 'required_arg'
# 如果把已经定义的参数放在后面,就会出现一个参数有两个值的情况

下面举个例子说明 *args, **kwargs 的用处
class Foo(object):
    def __init__(self, value1, value2):
        # do something with the values
        print value1, value2

class MyFoo(Foo):
    def __init__(self, *args, **kwargs):
        # do something else, don't care about the args
        print 'myfoo'
        super(MyFoo, self).__init__(*args, **kwargs)

当一个类需要继承另一个类的时候,例如MyFoo需要继承Foo,假设你不知道Foo有哪些参数,而只关注子类MyFoo的扩展(另一种情况是将来Foo可能会有变化),这时你就可以利用*args, **kwargs 来代表Foo的所有参数,传入到MyFoo

星号 *, 涉及到解包, unpacking, 这又是另一个话题了

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`*args`和`**kwargs`是Python中常用的函数参数用法,它们允许函数接受可变数量的参数。这样的参数定义允许我们在调用函数时传递不定数量的参数,使函数更加灵活。 1. `*args`:表示接受任意数量的非关键字参数,它将这些参数作为一个元组(tuple)传递给函数。 ```python def my_function(*args): for arg in args: print(arg) my_function('apple', 'banana', 'cherry') # 输出: # apple # banana # cherry ``` 2. `**kwargs`:表示接受任意数量的关键字参数,它将这些参数作为一个字典(dictionary)传递给函数。 ```python def my_function(**kwargs): for key, value in kwargs.items(): print(key, value) my_function(name='Alice', age=25, city='New York') # 输出: # name Alice # age 25 # city New York ``` 3. 结合使用`*args`和`**kwargs`:可以同时接受非关键字参数和关键字参数。 ```python def my_function(*args, **kwargs): for arg in args: print(arg) for key, value in kwargs.items(): print(key, value) my_function('apple', 'banana', name='Alice', age=25) # 输出: # apple # banana # name Alice # age 25 ``` 这种参数用法在编写函数时无需提前定义参数个数,可以适应不同情况下的参数传递需求。例如,在编写通用的装饰器函数时,使用`*args`和`**kwargs`可以接受任意函数的参数并传递给被装饰的函数。另外,如果有一个函数需要支持可变数量的参数,可以使用`*args`和`**kwargs`来处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值