set_defaults循环遍历解析器的操作,并设置每个
default属性:
def set_defaults(self, **kwargs): ... for action in self._actions: if action.dest in kwargs: action.default = kwargs[action.dest]
你的
-n论点(一个
action对象)时,你所定义的创建
base_parser。使用创建每个子解析器时
parents,该操作将添加到
._actions每个子解析器的列表中。它没有定义新的动作;它只是复制指针。
因此,当您
set_defaults在上使用时
subparser2,您
default可以为此共享操作修改。
此操作可能是
subparser1._action列表中的第二项(
h是第一项)。
subparser1._actions[1].dest # 'n' subparser1._actions[1] is subparser2._actions[1] # true
如果第二条语句为
True,则表示
action两个列表中的相同。
如果您
-n为每个子解析器分别定义,则不会看到此信息。它们将具有不同的动作对象。
我是根据我对代码的了解而工作的,而不是文档中的任何内容。最近在Cause
Python的argparse中指出了默认执行操作的内容是,该文档对
add_argument返回
Action对象一无所知。这些对象是代码组织的重要组成部分,但是在文档中却没有得到太多关注。
如果使用“解决”冲突处理程序,则通过引用复制父操作也会产生问题,并且需要重用父操作。
和Python错误问题:
http://bugs.python.org/issue22401
针对此问题的一种可能解决方案是(可选)复制操作而不是共享引用。这样
option_strings,
defaults可以在子级中修改and
,而不会影响父级。



