繁体   English   中英

Python argparse:如何获得简单的解析行为?

[英]Python argparse: How to get simple parsing behavior?

有关我们在Python中具有的各种选项和arg解析选择的优点的相关讨论,请参见此处

我正在制作一个diff脚本,该脚本与Python的difflib的输出difflib ,其中涉及的部分是处理可调用它的不同方式。 例如,Git将向您配置它的diff程序发送7个args(第二个和第五个是您要比较的文件),并且大多数差异也希望接受输入作为两个文件args。 有趣的是,git的difftool--extcmd=标志仅使用两个arg调用您指定的差异。

因此,使用OptionParser做到这一点真的很容易,因为它只给您一个args列表,我可以抓取第二个和第五个参数并将它们发送到fileinput

我确实注意到pydoc上的大横幅说它已被弃用,所以我在看argparse

我根本不清楚是否可以配置argparse来让您的程序接受一系列位置参数,而无需选择“启动”。 这就是我所需要的,因为我无法更改方式,例如Git会调用差异。

无论如何,我最终对sys.argv进行了一些琐碎的操作,毕竟,在这种特殊情况下,这是我应该做的。

if len(sys.argv) == 8:
        # assume this was passed to git; we can of course do
        # some parsing to check if we got valid git style args
        args = [sys.argv[2], sys.argv[5]]
elif len(sys.argv) == 3:
        args = sys.argv[:1]
else:
        sys.exit("Not a valid number of args (2 or 7) to this diff program")
print "Files: " + ' '.join(args)

如何使用argparse来实现一个仅尝试打开并读取其所有参数的程序?

原因是要使argparse弃用parseopt ,必须能够复制其所有功能(在合理范围内)。

只需添加一个在其前面没有破折号的参数即可。

import argparse
parser = argparse.ArgumentParser()
# You can change nargs to '+' for at least one argument
parser.add_argument('positional', nargs=2) # Positionals have no dashes
parser.add_argument('second_positional', nargs=1) 
parser.add_arguemnt('--optional', '-o')    # Optionals have dashes
args = parser.parse_args()

print args['positional'] # Your first two positional arguments
print args['second_positional'] # Second set
print args['optional'] # An optional argument

我只是制作了一个使用零个或多个位置参数的示例:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('args', metavar='arg', type=str, nargs='*',
    help='zero or more positional arguments')

args = parser.parse_args()
print args.arguments

您可以为此定义一个自定义动作 ,尽管它实际上与您自己的后处理args没什么不同,除非您有许多需要此动作的参数:

import argparse

class TwoOrSeven(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        if len(values) not in (2,7):
            raise argparse.ArgumentTypeError('Not a valid number of args (2 or 7)')
        try:
            values = values[2], values[5]
        except IndexError:
            values = values[0]
        setattr(namespace, self.dest, values)
parser = argparse.ArgumentParser()
parser.add_argument('args', metavar='arg', action=TwoOrSeven, nargs='+',
    help='Must be supplied 2 or 7 arguments')

args = parser.parse_args('1 2 3 4 5 6 7'.split())
print(args)
# Namespace(args=('3', '6'))
args = parser.parse_args('1 2'.split())
print(args)
# Namespace(args='1')
args = parser.parse_args('1 2 3 4 5 6'.split())
# argparse.ArgumentTypeError: Not a valid number of args (2 or 7)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM