所以三個示例電話是:
python reader.py some.txt
python reader.py new another.txt
python reader.py edit some.txt
處理這些最簡單的方法是用一個「可選」位置,以及一個要求之一。
parser = ArgumentParser...
parser.add_argument('-v','--verbose', ...)
parser.add_argument('cmd', nargs='?', default='open', choices=['open','edit','new'])
parser.add_argument('filename')
爲您3個樣本,它應該產生這樣的:
namespace(cmd='open', filename='some.txt')
namespace(cmd='new', filename='another.txt')
namespace(cmd='edit', filename='some.txt')
cmd
是一個可選的位置參數。如果缺失,則將一個字符串分配給filename
,並且cmd
得到其default
。比嘗試使subparsers
可選更容易。
至於當前的解析器:
parent_parser = argparse.ArgumentParser(description="Read text files.")
parent_parser.add_argument('filename', help='TXT file', type=file, nargs='+')
我不建議使用type=file
。最好使用FileType
或默認字符串(可讓您稍後在with context
中打開文件)。
至於nargs='+'
,你真的想分配1 or more
字符串到filename
?或者你是在想'?',那會是0 or 1
,也就是說它是可選的?
parent_parser.add_argument('--verbose', '-v', action='store_true',
help="Verbosity on")
child_parser = parent_parser.add_subparsers(title="subcommand",
help="Subcommand help")
new_file_command = child_parser.add_parser('new', help="New text file")
edit_file_command = child_parser.add_parser('edit', help="Edit existing text file")
混合此filename
位置,其接受可變數量的值,與subparsers參數(即期望要麼new
或edit
的位置)可能是一個問題。
我希望反對subparser命令丟失。 'python reader.py new another.txt'
會嘗試將new
分配給filename
和another.txt
以分包器,並引發錯誤。
倒不如在所有3個案件期望subparsers命令:
parent_parser = argparse.ArgumentParser(description="Read text files.")
parent_parser.add_argument('--verbose', '-v', action='store_true',
help="Verbosity on")
child_parser = parent_parser.add_subparsers(title="subcommand",
help="Subcommand help", dest='cmd')
open_file_command = child_parser.add_parser('open', help="Open text file")
open_file_command.add_argument('filename', help='TXT file')
new_file_command = child_parser.add_parser('new', help="New text file")
new_file_command.add_argument('filename', help='TXT file')
edit_file_command = child_parser.add_parser('edit', help="Edit existing text file")
edit_file_command.add_argument('filename', help='TXT file')
每一個命令,「開放」,「新」,「編輯」,需要一個「文件名」。
試圖避免使用open
命令將產生比它的價值更多的困難。
(存在這樣使得subparsers可選最新argparse一個bug /功能,但你不應該利用這一點沒有真正知道的問題。)
有了:
parser = argparse.ArgumentParser()
parser.add_argument('-v', '--verbose')
parser.add_argument('cmd', nargs='?', default='open',
choices=['open', 'edit', 'new'])
parser.add_argument('filename', nargs='+')
我希望reader.py new customstring
給
namespace(cmd='new', filename=[customstring])
它可以用作:
if args.cmd=='new':
with open(args.filename[0] + '.txt', 'w') as f:
# do something with the newly created file
open
和edit
會使用不同的open
模式。
嗨,感謝您的幫助。我還有最後一個問題。我仍然想知道如何定製位置參數。假設我有以下代碼: parser = argparse.ArgumentParser() parser.add_argument(' - v','--verbose') parser.add_argument('cmd',nargs ='?',default ='open ',options = ['open','edit','new']) parser.add_argument('filename',nargs ='+') 如果我想自定義命令'new'的位置參數?我不需要/希望傳遞明確的文件名,而只需要一個像'some'這樣的字符串,然後創建文件'some.txt'。我該怎麼做呢?謝謝 – user3056783
你可以創建一個自定義的'type'或'Action'。但通常在解析後進行這種更改會更簡單。特別是如果你沒有對「某些」進行錯誤檢查。 – hpaulj
嗨我還在閱讀文檔,並試圖找出這一點,但我無法在網上找到更多的例子。你能告訴我一個片段,你將如何實現這個解析後?因爲如果我執行'reader.py new customstring',它會對現有文件名進行錯誤檢查,所以它不會讓我做任何事情。 – user3056783