我正在编写一个Python脚本来处理一个机器可读的文件,并输出一个关于其中包含的数据的可读报告

对于Usage:,我希望看到类似script [-s | -c | -t] input file的值,如果没有传递参数,则默认为-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-cstdout (-s)将被强制为True,就像-s已经通过一样.

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

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

推荐答案

您可以让每个操作更新同一个变量,并提供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

您的代码可能如下所示:

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

第一种 Select :

您可以使用parser.set_defaults()来指定默认类型,而不是随意 Select .add_argument()中的一个来指定默认类型.

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

第二种 Select :

不必将类型指定为枚举值,您可以将可调用对象存储到类型中,然后调用可调用对象:

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-3.x相关问答推荐

我在创建Pandas DataFrame时感到困惑

Pandas 数据帧断言等同于NaN

正确的本地react 方式-Django身份验证

regexp多重前瞻行为的解释

使用 multiprocessing 处理图像

将 pandas Timestamp() 转换为 datetime.datetime() 以支持 peewee DateTimeField()

spaCy 中的匹配模式返回空结果

在不使用字符串方法的情况下查找字符串最后一个单词的长度 - Python

运行 pip install -r requirements.txt 时出错

排队多个子进程

Seaborn:注释线性回归方程

在 jupyter notebook 的单元格中使用 sudo

如何在 Spyder 控制台中使用变量执行 Python 3.3 脚本?

为什么`multiprocessing.Queue.get`这么慢?

从大字典中弹出 N 项的最快方法

在 WSL (Ubuntu) 中为 python3 安装 venv

python setup.py egg_info mysqlclient

使用完整路径激活 conda 环境

没有名为urlparse的模块,但我没有使用 urlparse

带有自定义标头的 urllib.urlretrieve