gpt4 book ai didi

Python 参数解析 : both optional and positional value for an argument

转载 作者:行者123 更新时间:2023-11-28 22:00:27 24 4
gpt4 key购买 nike

考虑以下用法:

usage: do.py [-h] [-s | -m] filename

这不是完整的用法。但我实际上想要的是 filename 是文件的实际值,而不是:

--filename FILENAME

而且,filename 应该是可选的,这样我就可以从标准输入中读取。想想 UNIX 上的 cat 程序。

你只需说:

cat filename

cat

编辑:现在,如果我在没有任何命令行选项的情况下执行程序 do.py,我将得到一个错误:参数太少。相反,即使我没有给它一个有效的 filename,我仍然希望它执行。我该怎么做?

最佳答案

更新 2:来自 ArgParse 文档,

One of the more common uses of nargs='?' is to allow optional input and output files:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('infile', nargs='?', type=argparse.FileType('r'),
... default=sys.stdin)
>>> parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'),
... default=sys.stdout)
>>> parser.parse_args(['input.txt', 'output.txt'])
Namespace(infile=<open file 'input.txt', mode 'r' at 0x...>,
outfile=<open file 'output.txt', mode 'w' at 0x...>)
>>> parser.parse_args([])
Namespace(infile=<open file '<stdin>', mode 'r' at 0x...>,
outfile=<open file '<stdout>', mode 'w' at 0x...>)

原答案:

这很简单:只需添加一个带有默认值和 nargs='*' 的位置参数。如果参数为零,将使用默认值,否则将使用命令行上的参数:

>>> p = argparse.ArgumentParser()
>>> p.add_argument('filename', nargs='*', default=['-'])
>>> p.parse_args([])
Namespace(filename=['-'])
>>> p.parse_args(['abc'])
Namespace(filename=['abc'])

通常,-用于指代标准输入/标准输出。

然后你做这样的事情:

def get_inputs(ns):
"""Iterate over input files."""
for path in ns.filename:
if path == '-':
yield sys.stdin
else:
yield open(path, 'r')

更新:我假设您需要多个文件名,因为 cat 需要多个文件名。如果您想要零个或一个文件名,您可以使用 nargs='?'

关于Python 参数解析 : both optional and positional value for an argument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14844230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com