zoukankan      html  css  js  c++  java
  • Python里的*args and **kwargs

    http://book.pythontips.com/en/latest/args_and_kwargs.html

    https://stackoverflow.com/questions/3394835/use-of-args-and-kwargs

    很多python新手会对于github和python标准库源码以及网上示例中各种*args and **kwargs感到困惑,这里解释一下。

    首先说明下:

    *args和**kwargs(key word args)只是一个约定俗成的写法,就相当于我们在列举一些事务时使用...结尾,你也可以使用.....或者。。。。。或者~~~~~等等符号,重要的是*和**这两个前缀,你用*inputs或者**inputs也可以。

    *args和**kwargs在很多python相关的官网常被用于介绍函数用法,其作用是表示多个参数,这点接下来会慢慢解释清楚。

    其实一般情况下在定义一个method或class时是不需要*args和**kwargs的,比如如下函数:

    def get_fullname(first_name,last_name):
        print(first_name+' '+last_name)
    
    get_fullname('Leo','Messi')
    # Leo Messi
    

    但是假如输入参数的数目是不确定的呢?由于输入参数不确定,因此我们不能确定该定义多少个输入参数,这时候*args就有用了:

    def get_fullname(*args):
        fullname=''
        for name in args:
            fullname+=' '+name
        print(type(args))
        print(fullname)
    
    get_fullname('Lionel','Andrés','Messi')
    # <class 'tuple'>
    # Lionel Andrés Messi
    

    可以看到*args的作用就是代表多个输入参数,python默认将多个输入参数存入一个名为args的元组中,但是注意这个元组本身并不是输入参数,在加上*前缀后,*args表示将元祖中的每个元素都当做一个输入参数(位置传参)。

    当然直接定义一个元组然后将其作为参数也是可行的,python会把这个元组解析为位置传参的输入参数例如:

    tup=('Lionel','Andrés','Messi')
    def get_fullname(*args):
        fullname=''
        for name in args:
            fullname+=' '+name
        print(type(args))
        print(fullname)
    
    get_fullname(*tup)  //注意这里tup前必须加*才能表示以元组的形式处理输入参数,否则函数会把tup元组本身当做一个输入参数处理
    # <class 'tuple'>
    # Lionel Andrés Messi
    

    至于**kwargs其作用就很好解释了,和*args的作用差不多,区别是*args是把参数列表当做一个元组进行处理,而**kwargs则是把参数列表当做一个dict处理,你要么传入多个key=value格式的参数,要么像如下示例一样直接传入一个字典:

    from pymysql import Connect
    config = {
              'host':'10.0.1.200',
              'port':6033,
              'user':'leo',
              'password':'leo',
              'db':'test',
              'charset':'utf8'
              }
    try:
        conn=Connect(**config)
    ......
    

    这里config是一个dict,**config就表示将此dict的key-value们解析为多个key=value的输入参数。

    完整示例:

    import pymysql
    
    class BasicServer(object):
        def __init__(self , **kwargs):
            self.conn = pymysql.connect(**kwargs)
    		# 这里使用**kwargs表示多个输入参数,且只能是key=value的格式,或者直接传入一个dict
        def _query(self , sql):
            with self.conn.cursor() as cursor:
                cursor.execute(sql)
                result = cursor.fetchall()
                return result
            self.conn.commit()
    
        def _close(self):
            self.conn.close()
    
        def get_version(self):
            version = self._query("select VARIABLE_NAME,VARIABLE_VALUE from information_schema.SESSION_VARIABLES where "
                                  "VARIABLE_NAME in ('VERSION_COMMENT','VERSION','VERSION_COMPILE_MACHINE',"
                                  "'VERSION_COMPILE_OS');")
            return version
     
    
    if __name__ == '__main__':
        conn_dict = { 'host': '10.1.1.11' , 'port': 3306 , 'db': None , 'user': 'leo' ,
                      'password': 'leo' , 'charset': 'utf8' , 'cursorclass': pymysql.cursors.DictCursor }
        testServer = BasicServer(**conn_dict)
        # 以上两行代码也可以使用如下一行代码代替:
        # testServer = BasicServer(host='10.1.1.11',port=3306,user= 'leo',password='leo')
        version = testServer.get_version()
        print(version)
    
  • 相关阅读:
    redis-mysql连接池
    Java并发编程原理
    利用MyBatis生成器自动生成实体类、DAO接口和Mapping映射文件
    Tomcat 启动图解
    JVM
    Java中的Exception
    Java 设计模式六原则及23中常用设计模式
    Jquery15 插件
    Jquery14 工具函数
    Jquery13 Ajax 进阶
  • 原文地址:https://www.cnblogs.com/leohahah/p/11724736.html
Copyright © 2011-2022 走看看