[英]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--
與早期的optparse
和getopt
相比, argparse
添加的重要功能之一是處理positionals
的能力。 它使用類似re
的語法和模式匹配將字符串(來自sys.argv
列表)分配給位置和可選(標記)arguments。
基本的解析例程是交替解析positionals
和optional
的 .
和:
--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
不保留有關cols
和date
選項如何交錯的信息。
我很想在位置中收集“文件”名稱,但是沒有辦法在每個可選之間排序連續的位置。
在最近的一次 SO 中,我建議使用列表預先填充args
,例如
argparse.Namespace(cols=[[]], date_format=[["%m/%d/%Y"]])
並更改cols
操作以替換最后一個空列表。 一個新的date_format
將同時更新cols
和date_format
以開始一個新的“狀態”。
在默認的Action
子類中, __call__
將新值寫入屬性(使用setattr
),覆蓋默認值或以前寫入的值。 append
子類,獲取屬性( getattr
),附加到它並寫回它。 默認類僅適用於它們自己的dest
。
Action
可以訪問的唯一“狀態”是namespace
。 但這可能就足夠了,您可以設計自定義操作子類來獲取和保存適當的屬性。 自定義操作甚至可以寫入和讀取add_argument
調用中未說明的屬性。 (在文檔中, set_defaults
用於為子解析器添加 function 屬性。)
另一種定制方法是定義一個新的Namespace
class。 默認的很簡單,只有一種顯示方式。 argparse
盡可能使用getattr
、 hasattr
和setattr
與命名空間交互,因此它對 class 施加最小的限制。
因此,在type
函數、 action
子類、 namespace
類和formatter
之間,自定義argparse
的空間很大。 但是您確實需要研究argparse.py
代碼。 並認識到您幾乎無法更改基本解析順序。
在解析之前處理sys.argv
是另一個工具,后處理args
命名空間也是如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.