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

Ale*_* B. 15 python argparse python-3.x

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

Usage:我而言,我希望看到类似的东西script [-s | -c | -t] input file,并且-s如果没有传递参数则成为默认值.

我目前有(相关的args,简而言之):

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
Run Code Online (Sandbox Code Playgroud)

所以,如果没有的-s,-t-c设定,stdout (-s)被迫为True,就好像-s已经过去了.

有没有更好的方法来实现这一目标?或者由于某种原因,另一种方法是否会被视为"更好"?

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

Rob*_*obᵩ 24

您可以让每个操作更新同一个变量,并将stdout作为该变量的默认值.

考虑这个程序:

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
Run Code Online (Sandbox Code Playgroud)

您的代码可能如下所示:

if args.type == 's':
    ofile = sys.stdout
elif args.type == 'c':
    ofile = ...
...
Run Code Online (Sandbox Code Playgroud)

第一种选择:

.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
Run Code Online (Sandbox Code Playgroud)

第二种选择:

您可以将callable存储到类型中,然后调用callable:而不是将类型指定为枚举值.

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()
Run Code Online (Sandbox Code Playgroud)