亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

用什么庫寫Python命令行程序

發布時間:2021-11-19 13:33:44 來源:億速云 閱讀:118 作者:iii 欄目:編程語言

這篇文章主要介紹“用什么庫寫Python命令行程序”,在日常操作中,相信很多人在用什么庫寫Python命令行程序問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”用什么庫寫Python命令行程序”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一、設計理念

在討論各個庫的設計理念之前,我們先設計一個計算器程序,其實這個例子在 argparse 庫的第一篇講解中出現過,也就是:

  • 命令行程序接受一個位置參數,它能出現多次,且是數字

  • 默認情況下,命令行程序會求出給定的一串數字的最大值

  • 如果指定了選項參數 --sum,那么就會將求出給定的一串數字的和

希望從各個庫實現該例子的代碼中能進一步體會它們的設計理念。

2.1、argparse

argparse  的設計理念就是提供給你最細粒度的控制,你需要詳細地告訴它參數是選項參數還是位置參數、參數值的類型是什么、該參數的處理動作是怎樣的。總之,它就像是一個沒有智能分析能力的初代機器人,你需要告訴它明確的信息,它才會根據給定的信息去幫助你做事情。

以下示例為 argparse 實現的 計算器程序:

import argparse  # 1. 設置解析器 parser = argparse.ArgumentParser(description='Calculator Program.')  # 2. 定義參數 # 添加位置參數 nums,在幫助信息中顯示為 num # 其類型為 int,且支持輸入多個,且至少需要提供一個 parser.add_argument('nums',  metavar='num', type=int, nargs='+',                     help='a num for the accumulator') # 添加選項參數 --sum,該參數被 parser 解析后所對應的屬性名為 accumulate # 若不提供 --sum,默認值為 max 函數,否則為 sum 函數 parser.add_argument('--sum', dest='accumulate', action='store_const',                     const=sum, default=max,                     help='sum the nums (default: find the max)')   # 3. 解析參數 args = parser.parse_args(['--sum', '1', '2', '3']) print(args) # 結果:Namespace(accumulate=<built-in function sum>, nums=[1, 2, 3])  # 4. 業務邏輯 result = args.accumulate(args.nums) print(result)  # 基于上文的 ['--sum', '1', '2', '3'] 參數,accumulate 為 sum 函數,其結果為 6

從上述示例可以看到,我們需要通過 add_argument 很明確地告訴 argparse 參數長什么樣:

  • 它是位置參數 nums,還是選項參數 --sum

  • 它的類型是什么,比如 type=int 表示類型是 int

  • 這個參數能重復出現幾次,比如 nargs='+' 表示至少提供 1 個

  • 參數的是存什么的,比如 action='store_const' 表示存常量

然后它才根據給定的這些元信息來解析命令行參數(也就是示例中的 ['--sum', '1', '2', '3'])。

這是很計算機的思維,雖然冗長,但也帶來了靈活性。

2.2、docopt

從 argparse 的理念可以看出,它是命令式的。這時候 docopt  另辟蹊徑,聲明式是不是也可以?一個命令行程序的幫助信息其實已然包含了這個命令行的完整元信息,那不就可以通過定義幫助信息來定義命令行?docopt  就是基于這樣的想法去設計的。

聲明式的好處在于只要你掌握了聲明式的語法,那么定義命令行的元信息就會很簡單。

以下示例為 docopt 實現的 計算器程序:

# 1. 定義接口描述/幫助信息 """Calculator Program.  Usage:   calculator.py [--sum] <num>...   calculator.py (-h | --help)  Options:   -h --help     Show help.   --sum         Sum the nums (default: find the max). """  from docopt import docopt  # 2. 解析命令行 arguments = docopt(__doc__, options_first=True, argv=['--sum', '1', '2', '3']) print(arguments) # 結果:{'--help': False, '--sum': True, '<num>': ['1', '2', '3']}  # 3. 業務邏輯 nums = (int(num) for num in arguments['<num>'])  if arguments['--sum']:     result = sum(nums) else:     result = max(nums)  print(result) # 基于上文的 ['--sum', '1', '2', '3'] 參數,處理函數為 sum 函數,其結果為 6

從上述示例可以看到,我們通過 __doc__ 定義了接口描述,這和 argparse 中 add_argument是等價的,然后 docopt  便會根據這個元信息把命令行參數轉換為一個字典。業務邏輯中就需要對這個字典進行處理。

對比與 argparse:

  • 對于更為復雜的命令程序,元信息的定義上 docopt 會更加簡單

  • 然而在業務邏輯的處理上,由于 argparse 在一些簡單參數的處理上會更加便捷(比如示例中的情形),相對來說 docopt  轉換為字典后就把所有處理交給業務邏輯的方式會更加復雜

2.3、click

命令行程序本質上是定義參數和處理參數,而處理參數的邏輯一定是與所定義的參數有關聯的。那可不可以用函數和裝飾器來實現處理參數邏輯與定義參數的關聯呢?而  click 正好就是以這種使用方式來設計的。

click 使用裝飾器的好處就在于用裝飾器優雅的語法將參數定義和處理邏輯整合在一起,從而暗示了路由關系。相比于 argparse 和 docopt  需要自行對解析后的參數來做路由關系,簡單了不少。

以下示例為 click 實現的 計算器程序:

import sys import click  sys.argv = ['calculator.py', '--sum', '1', '2', '3']  # 2. 定義參數 @click.command() @click.argument('nums', nargs=-1, type=int) @click.option('--sum', 'use_sum', is_flag=True, help='sum the nums (default: find the max)') # 1. 業務邏輯 def calculator(nums, use_sum):     """Calculator Program."""     print(nums, use_sum) # 輸出:(1, 2, 3) True     if use_sum:         result = sum(nums)     else:         result = max(nums)      print(result) # 基于上文的 ['--sum', '1', '2', '3'] 參數,處理函數為 sum 函數,其結果為 6  calculator()

從上述示例可以看出,參數和對應的處理邏輯非常好地綁定在了一起,看上去就很直觀,使得我們可以明確了解參數會怎么處理,這在有大量參數時顯得尤為重要,這邊是  click 相比于 argparse 和 docopt 最明顯的優勢。

此外,click 還內置了很多實用工具和額外能力,比如說 Bash 補全、顏色、分頁支持、進度條等諸多實用功能,可謂是如虎添翼。

2.4、firefire

則是用一種面向廣義對象的方式來玩轉命令行,這種對象可以是類、函數、字典、列表等,它更加靈活,也更加簡單。你都不需要定義參數類型,fire  會根據輸入和參數默認值來自動判斷,這無疑進一步簡化了實現過程。

以下示例為 fire 實現的 計算器程序:

import sys import fire  sys.argv = ['calculator.py', '1', '2', '3', '--sum']  builtin_sum = sum  # 1. 業務邏輯 # sum=False,暗示它是一個選項參數 --sum,不提供的時候為 False # *nums 暗示它是一個能提供任意數量的位置參數 def calculator(sum=False, *nums):     """Calculator Program."""     print(sum, nums) # 輸出:True (1, 2, 3)     if sum:         result = builtin_sum(nums)     else:         result = max(nums)      print(result) # 基于上文的 ['1', '2', '3', '--sum'] 參數,處理函數為 sum 函數,其結果為 6   fire.Fire(calculator)

從上述示例可以看出,fire 提供的方式無疑是最簡單、并且最 Pythonic  的了。我們只需關注業務邏輯,而命令行參數的定義則和函數參數的定義融為了一體。

不過,有利自然也有弊,比如 nums  并沒有說是什么類型,也就意味著輸入字符串'abc'也是合法的,這就意味著一個嚴格的命令行程序必須在自己的業務邏輯中來對期望的類型進行約束。

二、橫向對比

最后,我們橫向對比下argparse、docopt、click 和 fire 庫的各項功能和特點:

用什么庫寫Python命令行程序

到此,關于“用什么庫寫Python命令行程序”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

墨江| 广河县| 梁平县| 南陵县| 西盟| 宜都市| 长汀县| 施秉县| 乳山市| 周至县| 大同县| 平昌县| 和田市| 库伦旗| 广宁县| 峨眉山市| 饶阳县| 德清县| 静乐县| 莆田市| 东阳市| 威海市| 佳木斯市| 象山县| 方山县| 彩票| 长宁区| 连江县| 乌兰浩特市| 泾川县| 洛阳市| 运城市| 华宁县| 高邮市| 富源县| 常宁市| 萨迦县| 科技| 昌黎县| 鱼台县| 阿克苏市|