簡體   English   中英

使用 Python 中的 state 解析命令行

[英]Parse command line with state in Python

一些程序命令行具有 state,適用於狀態設置選項后的 arguments(rm 和 touch 的“--”參數就是一個例子;ffmpeg 是臭名昭著的有狀態參數)。 例如:

readmulticsv --cols 1,2,4 file1.csv --date_format "%Y-%m-%d" file2.csv --cols 4,3,9 file3.csv file4.csv

Here, it will pull columns 1, 2, and 4 from file1.csv and file2.csv and then pull columns 4, 3, and 9, in that order, from file3.csv and file4.csv. 此外,它將開始解釋 file1.csv 中的日期(在 --cols 參數的第一列中),默認格式為“%m/%d/%Y”,但切換到“%Y-%m-%d " 用於剩余的文件。 我想要的是一個列表列表,其中每個元素列表都有文件名和相關 state 變量的值:

[["file1.csv", "1,2,4", "%m/%d/%Y"],
 ["file2.csv", "1,2,4", "%Y-%m-%d"],
...
]

如果您手動遍歷 sys.argv,則實現這一點很簡單。

有沒有辦法用 argparse 做到這一點? 我的程序將 argparse 用於許多其他選項及其良好的幫助功能,並且整個代碼都是圍繞其命名空間 object 編寫的。 我可以使用 parse_known_args() 並將 rest 保留為“步行”方法,但這不包括 --cols、--date_format 以及幫助和命名空間中的文件。 我已經嘗試找出一個 Action(),但我不確定如何在那里進行。 設置文檔對我來說不是很清楚,我看不到如何訪問現有的 state。

是否有替代的 arg 解析器可以完成所有操作(幫助、默認值、命名空間)?

我的應用程序是一個通過讀取 CSV 交易文件來計算股票基礎、收益和增長的程序,其中投資在幾十年來具有不同文件格式和格式變化的經紀人之間轉移。 我可以為每種舊格式編寫一個轉換器,但我寧願編寫一個直接從源數據工作的程序。

謝謝,

--jh--

與早期的optparsegetopt相比, argparse添加的重要功能之一是處理positionals的能力。 它使用類似re的語法和模式匹配將字符串(來自sys.argv列表)分配給位置和可選(標記)arguments。

基本的解析例程是交替解析positionalsoptional的 .

和:

--cols 1,2,4 file1.csv --date_format "%Y-%m-%d" file2.csv --cols 4,3,9 file3.csv file4.csv

我可以想象定義一個

parser.add_argument('--cols', nargs='+', action='append')
parser.add_argument('--date_format', nargs='+', action='append')

導致

args.cols = [['1,2,4','file1.csv'], ['4,3,9', 'file3.csv', 'file4.csv']]
args.date_format = [["%Y-%m-%d", 'file2.csv']]

argparse不保留有關colsdate選項如何交錯的信息。

我很想在位置中收集“文件”名稱,但是沒有辦法在每個可選之間排序連續的位置。

在最近的一次 SO 中,我建議使用列表預先填充args ,例如

 argparse.Namespace(cols=[[]], date_format=[["%m/%d/%Y"]])

並更改cols操作以替換最后一個空列表。 一個新的date_format將同時更新colsdate_format以開始一個新的“狀態”。

Python 通過 argparse 多次使用不同的選項

在默認的Action子類中, __call__將新值寫入屬性(使用setattr ),覆蓋默認值或以前寫入的值。 append子類,獲取屬性( getattr ),附加到它並寫回它。 默認類僅適用於它們自己的dest

Action可以訪問的唯一“狀態”是namespace 但這可能就足夠了,您可以設計自定義操作子類來獲取和保存適當的屬性。 自定義操作甚至可以寫入和讀取add_argument調用中未說明的屬性。 (在文檔中, set_defaults用於為子解析器添加 function 屬性。)

另一種定制方法是定義一個新的Namespace class。 默認的很簡單,只有一種顯示方式。 argparse盡可能使用getattrhasattrsetattr與命名空間交互,因此它對 class 施加最小的限制。

因此,在type函數、 action子類、 namespace類和formatter之間,自定義argparse的空間很大。 但是您確實需要研究argparse.py代碼。 並認識到您幾乎無法更改基本解析順序。

在解析之前處理sys.argv是另一個工具,后處理args命名空間也是如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM