Python argparse,位置参数后的值

2024-05-23 14:45:45 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我写了一个非常小的程序来处理httpget和post请求。请求如下:

requestApp.py help
requestApp.py help get
requestApp.py help post
requestApp.py get [-v] [-h key:value] URL
requestApp.py post [-v] [-h key:value] [-d inline-data] [-f file] URL

如您所见,-v、-h、-d、-f、URL参数是可选的。get和post参数是非可选的。我将向您展示与此情况相关的程序片段:

^{pr2}$

command参数将是help、get或post,url参数是不言自明的。我的问题与上述第二和第三条命令有关,即:

requestApp.py help get
requestApp.py help post

如何确保在键入help get时,get不会在URL中注册(与help post相同)。另外,当我包含一个URL时,我希望它存储在URL参数中。我是否必须手动计算通过if语句传递的参数?还是有更好的办法?在


Tags: keypy程序urldata参数getvalue
2条回答

或许,最接近的解决方案是:

import argparse
import sys
print(sys.argv)
parser = argparse.ArgumentParser()
parser.add_argument('-k', ' keyvalue')
parser.add_argument('-v', ' verbose', action='store_true')
parser.add_argument('-d', ' data')
parser.add_argument('-f', ' file')
parser.add_argument('pos1', choices = ['help', 'get', 'post'])
parser.add_argument('pos2')

args = parser.parse_args()
print(args)

由此产生的帮助是:

^{pr2}$

合身并不完美。例如,您可以只提供help,但可以只提供-h。第二个位置值可以是任何字符串、“get”、有效的url或其他内容。你自己的代码必须有效。key:value位需要您自己的解析。在

argparse解析方法中,optionals可以以任何顺序出现。这两个位置必须按给定的顺序出现(彼此相对)。在


在较新的python中,我可以将最后一个位置改为“optional”,并使用新的intermixed解析器。这样我就可以“帮助”(或“得到”):

parser.add_argument('pos2', nargs='?')
args = parser.parse_intermixed_args()

如果两个位置值用标志分隔,则需要intermixed。由于某些复杂的原因,常规解析可能会使用“?”参数过早地留给您一个额外的无法识别的字符串。在

另一种方法是定义所有标记的参数,并使用parse_known_args。非标志值将在extras列表中,您可以根据需要对其进行分析。像optparse这样的旧解析器本质上就是这样做的。argparse还添加了处理位置参数的有限能力,但严格按位置,而不是按值。在

使用argparse执行此操作非常复杂。下面是如何使用docoptdocopt解析使用模式并返回字典:

"""
Usage:
    requestApp help [get|post]
    requestApp get [-v] [-k=key:value] <URL>
    requestApp post [-v] [-k=key:value] [-d=data] [-f file] <URL>

Options:
    -v  verbose       This is verbose mode
    -d=data            This option does this
    -k=key:value       This one does that
    -f file            This one is magic
"""

from docopt import docopt

ARGS = docopt(__doc__)

例如,requestApp.py post -k hello:world -f myfile.txt google.comdocopt将返回:

^{pr2}$

然后您可以:

if ARGS['help']:
    if ARGS['get']: pass                # requestApp help get
    else if ARGS['post']: pass          # requestApp help post
    else: pass                          # requestApp help
    exit()

if ARGS['get']: pass                    # requestApp get
else if ARGS['post']: pass              # requestApp post

if ARGS[' verbose']: print("this is just the beginning") 

默认情况下,-h是一个保留选项(用于帮助),它使docopt返回使用模式并退出。 docopt将使用模式返回到stdout,如果您尝试非法命令,如requestApp help unicorn,则退出

相关问题 更多 >