Python argparse - 如果没有给出参数,则默认互斥组

标签 python python-3.x argparse

我正在编写一个 Python 脚本来处理一个机器可读的文件并输出一个关于其中包含的数据的人类可读的报告。
我想提供将数据输出到 stdout (-s)(默认情况下)或 txt (-t) 或 csv (- c) 文件。我想要一个默认行为的开关,就像许多命令一样。

用法:而言,我希望看到类似script [-s | -c | -t] 输入文件,如果没有传递参数,则将 -s 设置为默认值。

我目前有(对于相关参数,简而言之):

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('-s', '--stdout', action='store_true')
group.add_argument('-c', '--csv', action='store_true')
group.add_argument('-t', '--txt', action='store_true')
args = parser.parse_args()

if not any((args.stdout, args.csv, args.txt)):
    args.stdout = True

因此,如果未设置 -s-t-c,则 stdout (-s) 被强制为 True,就像传递了 -s 一样。

有没有更好的方法来实现这一点?或者出于某种原因,另一种方法是否会被普遍认为“更好”?

注意:我使用的是 Python 3.5.1/2,我不担心与其他版本的兼容性,因为此时没有计划与其他人共享此脚本。这只是为了让我的生活更轻松。

最佳答案

您可以让每个操作更新同一个变量,提供标准输出作为该变量的默认值。

考虑这个程序:

import argparse

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument(
    '-s', '--stdout', action='store_const', dest='type', const='s', default='s')
group.add_argument(
    '-c', '--csv', action='store_const', dest='type', const='c')
group.add_argument(
    '-t', '--txt', action='store_const', dest='type', const='t')
args = parser.parse_args()
print args

您的代码可能如下所示:

if args.type == 's':
    ofile = sys.stdout
elif args.type == 'c':
    ofile = ...
...

第一种选择:

与其随意选择 .add_argument() 之一来指定默认类型,不如使用 parser.set_defaults() 来指定默认类型。

import argparse

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('-s', '--stdout', action='store_const', dest='type', const='s')
group.add_argument('-c', '--csv', action='store_const', dest='type', const='c')
group.add_argument('-t', '--txt', action='store_const', dest='type', const='t')
parser.set_defaults(type='s')
args = parser.parse_args()
print args

第二种选择:

与其将类型指定为枚举值,不如将可调用对象存储到类型中,然后调用该可调用对象:

import argparse

def do_stdout():
    # do everything that is required to support stdout
    print("stdout!")
    return
def do_csv():
    # do everything that is required to support CSV file
    print("csv!")
    return
def do_text():
    # do everything that is required to support TXT file
    print("text!")
    return

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('-s', '--stdout', action='store_const', dest='type', const=do_stdout)
group.add_argument('-c', '--csv', action='store_const', dest='type', const=do_csv)
group.add_argument('-t', '--txt', action='store_const', dest='type', const=do_text)
parser.set_defaults(type=do_stdout)
args = parser.parse_args()
print args
args.type()

关于Python argparse - 如果没有给出参数,则默认互斥组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38507675/

相关文章:

python - 为什么我不能用python从谷歌下载图片?

python - 为什么我的 argparse 抛出 SystemExit 2 错误?

python - 高效存储的字典。这个数据结构是否存在,它叫什么?

python - Pandas 如何处理类型为 "object"的列与整数进行比较的情况?

python - 为 Pyspark 中的每一行计算列中不同的子字符串出现次数?

Python3 - argparse 开关和文件

python - 来自文本文件的 Argparse 自定义帮助

python - 使用 .loc 和日期检索值

python - 使用新键从现有字典创建新字典

python - 如何从 Raspbian 上的 systemd 服务正确重定向 stdout/stderr?