以前在用到mechanize和调用win32接口时遇到大量签名为*args, **kwds的方法,如:
mechanize的模块_form.py中有如下代码:
def ParseString(text, base_uri, *args, **kwds):
fh = StringIO(text)
return ParseFileEx(fh, base_uri, *args, **kwds)
def ParseFileEx(file, base_uri,
select_default=False,
form_parser_class=FormParser,
request_class=_request.Request,
entitydefs=None,
encoding=DEFAULT_ENCODING,
# private
_urljoin=urlparse.urljoin,
_urlparse=urlparse.urlparse,
_urlunparse=urlparse.urlunparse,
):
在简单的查阅后这个和java中的可变参数类似,如:
public void foo(String ...name){}
其中*args是一个可变长度的list,而**kwds为可变长度的字典。当然既然都是可变的,这两个作为方法签名也可以没有。虽然如此,在使用过程中遇到了不少问题,特将做的一些测试记录下来。
为了模拟上面的调用,定义了两个方法:
def foo(name, *args, **kwds):
print "name= ", name
print "args= ", args
print "kwds= ",kwds
bar(name, *args, **kwds)
def bar(name, age, address,a="aaa", b="bbb"):
print "name= ",name
print "age= ", age
print "a= ", a
print "b= ", b
可以想到,其中name为不变参数是不可缺少的,那么接下来的参数为list和dict,于是有了以下:
foo("nico", ("10", "chengdu"), {"a":"aaaaaaaaa", "b":"vvvvvvvvvvvvv"})
天真的以为对应了三个参数,可是打印的结果:
name= nico
args= (('10', 'chengdu'), {'a': 'aaaaaaaaa', 'b': 'vvvvvvvvvvvvv'})
kwds= {}
可是与期望的不一样,而且除去第一个参数作为name的值,其他的都当做list处理了,经过处理,按照如下传递:
foo("nico", "10", "chengdu", a="aaaaaaaaa", b="vvvvvvvvvvvvv")
相应的结果为:
foo
**********
name= nico
args= ('10', 'chengdu')
kwds= {'a': 'aaaaaaaaa', 'b': 'vvvvvvvvvvvvv'}
bar
**********
name= nico
age= 10
a= aaaaaaaaa
b= vvvvvvvvvvvvv
达到预期的效果了,虽然传递的形式觉得有点怪异。同时从对bar的签名中可以看出:
bar(name, *args, **kwds)
def bar(name, age, address,a="aaa", b="bbb"):
这里有签名age、address对应*args。a,b对应**kwds。也就是说list长度只能为2,dict的长度也只能为2。
foo("nico", "10", a="aaaaaaaaa", b="vvvvvvvvvvvvv")
foo("nico", "10", "chengdu", a="aaaaaaaaa", b="vvvvvvvvvvvvv", c="aa")
无一例外,都抛出异常
好了,这是网上找到的更多信息
def foo(*args, **kwargs):
print 'args = ', args
print 'kwargs = ', kwargs
print '---------------------------------------'
if __name__ == '__main__':
foo(1,2,3,4)
foo(a=1,b=2,c=3)
foo(1,2,3,4, a=1,b=2,c=3)
foo('a', 1, None, a=1, b='2', c=3)
输出
args = (1, 2, 3, 4)
kwargs = {}
---------------------------------------
args = ()
kwargs = {'a': 1, 'c': 3, 'b': 2}
---------------------------------------
args = (1, 2, 3, 4)
kwargs = {'a': 1, 'c': 3, 'b': 2}
---------------------------------------
args = ('a', 1, None)
kwargs = {'a': 1, 'c': 3, 'b': '2'}
---------------------------------------
分享到:
相关推荐
在Python编程中,`*args` 和 `**kwargs` 是两个非常有用的语法特性,它们允许函数接收可变数量的参数。这些参数在函数定义时并不知道具体的数量,因此在需要处理不确定参数个数的情况时非常有用。本文将深入探讨这两...
# 当函数的参数不确定时,可以使用*args和**kwargs。*args没有key值,**kwargs有key值 def fun_var_args(farg, *args): print ‘args:’, farg for value in args: print ‘another arg:’,value # *args可以当作...
使用可变参数可以很好解决该问题,注意可变参数在函数定义不能出现在特定参数和默认参数前面,因为可变参数会吞噬掉这些参数。 def report(name, *grades): total_grade = 0 for grade in grades: total_grade ...
在Python编程语言中,`*args` 和 `**kwargs` 是两种非常重要的语法特性,它们允许函数接收可变数量的参数。这些参数在函数定义时不是预先定义好的,而是根据调用函数时传递的参数数量动态调整的。下面将详细解释它们...
主要是 用来表示函数接收可变长度的非关键字参数列表作为函数的输入。 **kwargs:表示的就是形参中按照关键字传值把多余的传值以字典的方式呈现 主要是 用来表示函数接收可变长度的关键字参数列表作为函数的输入。...
### Python通过可变参数计算n个数的乘积方法 #### 概述 本文将详细介绍如何在Python中使用可变参数来实现多个数值的乘积计算。可变参数是一种非常实用的功能,在处理不确定数量的参数时特别有用。下面将通过一个...
在Python编程语言中,`*args` 和 `**kwargs` 是两种特殊语法,它们用于处理函数调用时的可变参数。这些语法使得函数能够接受不确定数量的位置参数(`*args`)和关键字参数(`**kwargs`)。下面将详细解释它们的用法...
*args 用来将参数打包成tuple给函数体调用 def args_test(x, y, *args): print(x, y, args) args_test(1,2,3,4,5) 1 2 (3, 4, 5) 二、**kwargs的使用方法 **kwargs 打包关键字参数成dict给函数体调用 def kwargs...
在Python函数编程中,*args和**kwargs是处理可变数量参数的两种非常灵活的方式。它们允许函数接受任意数量的位置参数和关键字参数,从而极大地增强了函数的通用性和灵活性。本文将详细介绍*args和**kwargs的概念、...
在Python编程语言中,函数参数的传递方式有很多种,其中*args和**kwargs是处理可变数量参数的特殊语法。这两个语法糖允许我们在函数定义时接收不确定数量的位置参数或关键字参数。本文将详细解释这两种语法的用法,...
本篇将深入探讨Python中的可变参数,包括位置参数、默认参数、*args 和 **kwargs。 一、位置参数 位置参数是最基础的参数类型,它们按照传入函数的顺序进行匹配。例如,下面的函数接受两个位置参数a和b: ```...
在Python编程语言中,*args和**kwargs是两个非常重要的特性,用于处理函数的可变数量参数。它们允许程序员向函数传递不确定数量的参数,并且以特定的方式处理这些参数。接下来,我们将详细解释这两个概念的含义和...
3. **Args参数**: 在Python函数定义中,`*args`是一个可变参数,允许函数接收任意数量的位置参数。当传递的参数数量不确定时,可以使用`*args`来捕获所有额外的参数。在lambda函数中,虽然不常见,但仍然可以使用`*...
在Python中,可变参数通常以星号(*)或双星号(**)来定义。单个星号(*)表示可变数量的非关键字参数,而双星号(**)用于收集关键字参数。 1. **非关键字参数 (可变数量的位置参数)** 使用单星号(*)定义的可变参数...