什么是 Python 的“命名空间”对象?

use*_*941 11 python

我知道什么是命名空间。但跑步时

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('bar')
parser.parse_args(['XXX']) # outputs:  Namespace(bar='XXX')
Run Code Online (Sandbox Code Playgroud)

是什么样的物体Namespace(bar='XXX')?我觉得这完全令人困惑。

阅读 argparse 文档,它说“大多数 ArgumentParser 操作都会添加一些值作为 parse_args() 返回的对象的属性”。那么这个对象在运行时不应该出现吗globals()?或者说我该如何反省呢?

Sil*_*olo 12

Samwise的回答非常好,但让我回答问题的另一部分。

或者说我该如何反省呢?

在任何语言中,能够内省对象都是一项宝贵的技能,因此让我们将其视为Namespace完全未知的类型。

>>> obj = parser.parse_args(['XXX']) # outputs:  Namespace(bar='XXX')
Run Code Online (Sandbox Code Playgroud)

你的第一直觉是好的。看看全局范围内是否有a Namespace,没有。

>>> Namespace
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'Namespace' is not defined
Run Code Online (Sandbox Code Playgroud)

那么让我们看看这个东西的实际类型。打印机Namespace(bar='XXX')语法来自某处的__str__or方法,所以让我们看看实际的__repr__类型是什么。

>>> type(obj)
<class 'argparse.Namespace'>
Run Code Online (Sandbox Code Playgroud)

及其模块

>>> type(obj).__module__
'argparse'
Run Code Online (Sandbox Code Playgroud)

现在可以肯定的是,我们可以做到from argparse import Namespace并获得该类型。除此之外,我们还可以做

>>> help(argparse.Namespace)
Run Code Online (Sandbox Code Playgroud)

在交互式解释器中获取有关课程的详细文档Namespace,所有这些都不需要互联网连接。


Sam*_*ord 5

它只是生成的数据的容器parse_args

https://docs.python.org/3/library/argparse.html#argparse.Namespace

这个类故意很简单,只是一个具有可读字符串表示形式的对象子类。

只是parser.parse_args(...).bar为了获得你的论点的价值bar。这就是该对象的全部内容。根据文档,您还可以通过将其转换为字典vars()

Namespace运行时不会出现该符号globals(),因为您没有单独导入它。(您可以argparse.Namespace随意访问它。)不过,根本没有必要接触它,因为您不需要自己实例化Namespace。我已经使用 argparse 多次,直到看到这个问题为止,从未关注过它返回的对象类型的名称——这对于 argparse 的实际应用完全不重要。