gpt4 book ai didi

python - 在位置参数和选项之间共享目标

转载 作者:行者123 更新时间:2023-12-02 05:47:43 26 4
gpt4 key购买 nike

我有一个非常简单的 ArgumentParser 实例,带有可选的位置参数和一个选项,它将一个常量写入同一目的地:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-a', action='store_const', dest='path', const='<all>')
parser.add_argument('path', nargs='?')

# Prints None instead of '<all>'
print(parser.parse_args(['-a']).path)

但无论如何,解析命令行 ['-a'] 不会生成 Path 设置为该实例的 Namespace 实例持续的。相反,使用位置参数的默认值。

我做错了什么?

我的用例是用户应该能够指定路径(实际上是路径列表)。此路径列表默认为当前工作目录。但是可以传递 -a 而不是使用默认值,这应该会导致使用一些配置的根目录。参数解析器这部分的完整代码是这样的:

all_sentinel = object()

parser = argparse.ArgumentParser()
paths_group = parser.add_mutually_exclusive_group()
paths_group.add_argument('-a', action='store_const', dest='paths', const=all_sentinel)
paths_group.add_argument('paths', nargs='*', default=['.'])

最佳答案

带有 nargs='?' 的位置对其默认值进行了一些特殊处理(此处为 None)。

通常,默认值会在解析开始时分配给命名空间,并被操作(例如可选操作)覆盖。

因为空值列表满足 nargs,所以该位置始终是“可见”。但解析器不会分配 [] 或其他“空白”,而是分配默认值。因此位置的默认值会覆盖“-a”设置的值。

nargs='*' 获得相同类型的特殊处理。

我怀疑如果您在“-a”之前有另一个位置参数,您将不会看到这种效果。 '?*' 位置将在 '-a' 之前处理,并且不会覆盖其值。

仅当标志出现时才处理选项。无论nargs如何,位置总是被处理。处理“可选”位置,但对默认值进行一些额外处理。但是,相对于标记的参数处理它们的时间可能会有所不同。

我之所以意识到这是一些棘手的行为,只是因为我详细研究了代码,并在这里回答了很多关于 Python 错误/问题的问题。

共享dest通常确实有效,但这更多是默认情况下的而不是设计。这是其他设计选择的结果。 argparse 对此不做任何 promise 。因此,如果它不可靠,请不要使用它。

关于python - 在位置参数和选项之间共享目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60525957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com