Python 在位置参数和选项之间共享dest

Python 在位置参数和选项之间共享dest,python,argparse,Python,Argparse,我有一个非常简单的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

我有一个非常简单的
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)

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

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

由于值的空列表满足
nargs
,因此该位置总是“可见”。但是解析器并没有将
[]
或其他一些“空白”赋值给它,而是将默认值赋值给它。因此位置的默认值将覆盖由'-a'设置的值

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

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

仅当标志出现时才处理选项。始终处理位置,而不考虑
nargs
。处理“可选”位置,但对默认值进行一些额外处理。但当它们相对于标记的参数进行处理时,可能会有所不同

这是我所知道的一些棘手的行为,因为我已经详细研究了代码,并回答了很多关于Python bug/问题的问题


共享
dest
通常是可行的,但这在默认情况下比设计更有效。这是其他设计选择的结果
argparse
在这方面没有做出任何承诺。因此,如果它不可靠,就不要使用它。

哦,很高兴知道。我确实有点希望这会得到支持。我得出这个结论可能是因为位置参数和选项实际上是同一个互斥组的一部分(我更新了问题),因此我希望参数的定义在使用选项时不会对结果产生影响。但仔细想想,参数的默认值仍然被插入到名称空间中,这是有道理的,令人遗憾的是,它覆盖了我的值。嗯,还不错。我仍然对
argparse
使编写命令行工具变得有趣的程度印象深刻:)互斥组不会更改对
dest
的处理。组测试使用
seen\u非\u默认\u动作
集,这与
seen\u动作
集不同,它处理这些非必需的位置。
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=['.'])