一個超神的 Python 命令行解析庫

一個超神的 Python 命令行解析庫

在 Python 中,命令行解析庫有非常多的選擇方案,系統自帶的 模塊有 argparse,有 Flask 作者寫的 click,但是 argparse 使用起來囉嗦, 要經歷解析器初始化、參數定義、解析一套流程。例如:

# -*- coding: utf-8 -*-# arg_test.pyimport argparsedef counter(file_type=None): return {file_type: 100}# 初始化解析器parser = argparse.ArgumentParser()# 定義參數parser.add_argument("-f", "--file", help="統計指定文件類型")# 解析args = parser.parse_args()print(counter(args.file))

運行:

$ python arg_test.py -f python{'python': 100}

而 click 則是以裝飾器的形式作用在目標函數中,要侵入函數本身,本質上還是對 argparse 的一種改進,並沒有太多創新,算是一種改良作品

# -*- coding: utf-8 -*-import argparseimport [email protected]()@click.option("-f", "--file", help="統計制定文件類型")def counter(file=None): click.echo({file: 100})if __name__ == '__main__': print(counter())

運行:

$ python firetest.py -f python{u'python': 100}

接下來要介紹的這個命令行解析工具非常牛逼,把命令行工具做到了極致,算是一種顛覆式創新,一行代碼能把函數導出到命令行窗口,這個工具叫Python-fire,可能經常寫命令行工具的人知道,該項目是 Google 開源的 Python 庫(可能是 Google 工程師的 Side Project,因為項目主頁申明說它不是 Google 官方項目),名字就像一團。

安裝

pip install fire

用法1: fire.Fire()

直接在程序中調用 fire.Fire(),不需要修改目標函數,fire 會把當前模塊下的所有對象導出到命令行中

# firetest.pyimport firedef foo(name): return 'foo {name}!'.format(name=name)def bar(name): return "bar {name}".format(name=name)if __name__ == '__main__': fire.Fire()

運行:

# 調用方式:python [文件名] [函數名] [參數]# 函數名後面直接跟參數值$ python firetest.py foo hellofoo hello!# 也可以顯示地先指定參數名,再跟參數值$ python firetest.py bar --name hellobar hello!

用法2: fire.Fire(<fn>)

Fire 可以指定某個函數導出到命令行

import firedef foo(name): return 'foo {name}!'.format(name=name)if __name__ == '__main__': fire.Fire(foo)

運行:

# 調用方式:python [函數名] [參數]$ python firetest.py hellofoo hello!

當 Fire 接收函數 foo 作為參數時,只加載 foo 函數到命令行中,此時,在命令行中運行時也無需再指定函數名字,只需要指定參數就好。

用法3:fire.Fire(<dict>)

Fire 不僅可以接收函數,還可以接收字典對象作為參數,可在字典中配置那些函數需要導出到命令行中。例如,有加減乘3個函數,我們可以選擇性的選擇其中2個導出到命令行:

import firedef add(x, y): return x + ydef multiply(x, y): return x * ydef subtract(x, y): return x - yif __name__ == '__main__': fire.Fire({ 'add': add, 'subtract': subtract, })

運行:

$ python firetest.py add 1 45$ python firetest.py subtract 1 4-3$ python firetest.py multiply 1 4# multiply 會報錯,因為沒有導出

用法4:fire.Fire(<object>)

Fire 還可以接收類的實例對象

import fireclass Calculator(object): def add(self, x, y): return x + y def multiply(self, x, y): return x * yif __name__ == '__main__': calculator = Calculator() fire.Fire(calculator)

使用方式還是和前面的一樣

$ python firetest.py add 10 2030$ python firetest.py multiply 10 20200

更多用法可以參考python-fire的文檔:https://github.com/google/python-fire/blob/master/docs/guide.md

End.

運行人員:中國統計網小編(微信號:itongjilove)

微博ID:中國統計網

中國統計網,是國內最早的大數據學習網站,公眾號:中國統計網

//www.itongji.cn

相關推薦

推薦中...