python-3.x - 我怎样才能轻松地创建一个带有逆函数的 python argparse 参数?

标签 python-3.x command-line-arguments argparse

使用 argparse使用 Python 3,我想创建一对互补的参数:

--log-file=~/some-default-log-filename.txt
--no-log-file

如示例所示,默认情况下,日志文件参数将具有默认值(文件名)。您可以通过为 --log-file 指定不同的字符串值来更改它,或者通过指定 --no-log-file 完全删除日志文件。

在 argparse 中执行此操作的优雅方法是什么?我根本找不到任何方法来进行反向/互补论证,不介意在哪里有字符串论证。

最好的情况是,当我执行 args = parser.parse_args() 时,args.log_file 包含日志文件名(包括默认文件名)或 None 如果指定了 no-log-file 选项。

最佳答案

检查此结尾是否有 store_const基于解决方案。

我记得看到一个旧的 python 错误问题,建议扩展 argparse使用一些可以自动处理 --foo 的代码和 --no-foo也许还有其他一些变体。也许我稍后会找到它。

但目前argparse没有符合您规范的机制。

nargs='?'constdefault旨在处理像您这样的 3 折式手机壳。

# no --foo, assign the 'default'
--foo # without arg, assign the 'const'
--foo arg  # assign the supplied string

虽然语法不是您想要的,但我认为它为您的用户提供了相同的控制权。

为了更接近您想要的语法,您必须同时创建 logfile参数,以及 no-log参数,然后使用简单的 pos-parsing 测试来“合并”两者。

parser.add_argument('--log-file', ....)
parser.add_argument('--no-log', action='store_true')

及以后:

if args.no_log:
    args.log_file = None

如果您必须像这样创建许多参数对,您可以定义一个辅助函数:

def make_inverse_arg(parser, *args, **kwargs):
    parser.add_argument(*args, **kwargs)
    # define inverse
    arg1 = '--no-'+args[1][2:]
    parser.add_argument(arg1, action='store_true')
    # could be more robust, but you get the idea
    def post_test():
         ...
    return post_test

如果--no-foo被定义为“store_const”参数,const=None--foo 相同的目标, 那么它只会把 None在命名空间中存在时。 default=SUPPRESS确保它不会将自己的默认值放入命名空间。

parser=argparse.ArgumentParser()
parser.add_argument('--no-foo', dest='foo', action='store_const', const=None,
     default=argparse.SUPPRESS)
parser.add_argument('--foo',default='test')

In [329]: parser.parse_args([])
Out[329]: Namespace(foo='test')

In [330]: parser.parse_args('--foo xxx'.split())
Out[330]: Namespace(foo='xxx')

In [331]: parser.parse_args('--foo xxx --no-foo'.split())
Out[331]: Namespace(foo=None)

In [332]: parser.parse_args('--no-foo --foo xxx'.split())
Out[332]: Namespace(foo='xxx')

In [333]: parser.parse_args('--no-foo'.split())
Out[333]: Namespace(foo=None)

如果--foo的最后一个有冲突和 --no-foo确定 namespace 中的内容。

关于python-3.x - 我怎样才能轻松地创建一个带有逆函数的 python argparse 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30383943/

相关文章:

Python argparse 值范围帮助消息外观

python - 是什么使得可选参数是可选的而位置参数是必需的?

python-3.x - 如何将一列的内容移动到其旁边的列

gcc - gcc -E 选项代表什么?

C 程序中的命令行参数(来自 shell)

python-3.x - 所有子解析器的可选参数

Python:使用shiftgrid改变经度

python - 什么是 `1..__truediv__` ? Python 是否有 .. ("dot dot") 表示法语法?

python - 使用 __name__ 作为属性

c - 如何在 visual studio 中传递多个命令参数?