Python直接用字典陣列匯入到函式的非固定引數

weixin_33766168發表於2017-11-08

正好是學logging模組的時候遇到的。程式碼是這樣的:

1
2
3
4
5
6
7
logging.basicConfig(filename='test.log',
                    level=logging.DEBUG,
                    format='%(name)s %(asctime)s %(module)s-%(lineno)d [%(levelname)s]:%(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S')
logging.warning('test warning')
logging.info('test info')
logging.debug('test debug')

上面的logging.basicConfig()要一堆引數,而且實驗了一下,貌似必須得用關鍵引數,不能偷懶。於是好奇看了一下help

1
2
3
4
5
import logging
help(logging.basicConfig)
# 下面是help的頭2行,後面就不貼了
Help on function basicConfig in module logging:
basicConfig(**kwargs)  # 這裡原來用的是非固定引數

一看,整個就是非固定引數,那麼只能老實的一個一個寫了。但是一想,這裡**kwargs會把多傳入的關鍵引數變成一個字典,那麼問題來了:

既然要變成字典,那我直接定義個字典,傳個字典進去唄。

1
2
3
4
5
6
7
8
9
10
11
import logging
# 想著把引數做定義成一個常量,放到配置檔案裡或者檔案開頭。另外format太長了先單獨寫。
LOG_FORMAT = '%(asctime)s %(module)s-%(lineno)d [%(levelname)s]:%(message)s'
LOG_KWARGS = {'filename':'test.log',
              'level':logging.DEBUG,
              'format':LOG_FORMAT,
              'datefmt':'%Y-%m-%d %H:%M:%S'}
logging.basicConfig(**LOG_KWARGS)  # 字典前也加上**就能傳入字典作為引數了
logging.warning('test warning')
logging.info('test info')
logging.debug('test debug')

既然字典能這麼傳參,那麼陣列也一樣了。

1
2
3
4
5
6
def deal_list(*args):
    print(args)
def deal_dic(**kwargs):
    print(kwargs)
deal_list(*[1,2,3,4,5])  # *args是把引數都變成元組,所以這裡列印出來得是一個元組
deal_dic(**{'a':1,'b':2})















本文轉自騎士救兵51CTO部落格,原文連結:http://blog.51cto.com/steed/1982184,如需轉載請自行聯絡原作者

相關文章