设为首页 收藏本站
查看: 769|回复: 0

[经验分享] python 可变参数 *args, **kwds

[复制链接]

尚未签到

发表于 2017-4-30 14:48:07 | 显示全部楼层 |阅读模式
  以前在用到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'}
---------------------------------------
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-371309-1-1.html 上篇帖子: Python udp 回显服务 下篇帖子: python 获取异常全部信息
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表