[英]What is Python's "Namespace" object?
我知道命名空间是什么。 但是跑步的时候
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('bar')
parser.parse_args(['XXX']) # outputs: Namespace(bar='XXX')
Namespace(bar='XXX')
是什么样的 object ? 我觉得这完全令人困惑。
阅读 argparse 文档,它说“大多数 ArgumentParser 操作添加一些值作为 parse_args() 返回的 object 的属性”。 运行globals()
时不应该出现这个 object 吗? 或者我如何反省它?
Samwise 的回答很好,但让我回答问题的另一部分。
或者我如何反省它?
能够内省对象在任何语言中都是一项宝贵的技能,因此让我们将其视为Namespace
是一种完全未知的类型。
>>> obj = parser.parse_args(['XXX']) # outputs: Namespace(bar='XXX')
你的第一直觉是好的。 查看全局scope中是否有Namespace
,没有。
>>> Namespace
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'Namespace' is not defined
因此,让我们看看事物的实际类型。 Namespace(bar='XXX')
打印机语法来自某处的__str__
或__repr__
方法,所以让我们看看实际类型是什么。
>>> type(obj)
<class 'argparse.Namespace'>
及其模块
>>> type(obj).__module__
'argparse'
现在可以肯定的是,我们可以from argparse import Namespace
执行并获取类型。 除此之外,我们还可以做
>>> help(argparse.Namespace)
在交互式解释器中获取有关Namespace
class 的详细文档,所有这些都不需要 Inte.net 连接。
它只是parse_args
生成的数据的容器。
https://docs.python.org/3/library/argparse.html#argparse.Namespace
这个 class 故意简单,只是一个 object 的子类,具有可读的字符串表示。
只需执行parser.parse_args(...).bar
即可获取bar
参数的值。 这就是 object 的全部内容。根据文档,您还可以通过vars()
将其转换为字典。
运行globals()
时符号Namespace
不会出现,因为您没有单独导入它。 (如果需要,您可以将其作为argparse.Namespace
访问。)不过,根本没有必要接触它,因为您不需要自己实例化一个Namespace
。 我已经多次使用 argparse,直到看到这个问题,才注意到它返回的 object 类型的名称——这对 argparse 的实际应用完全不重要。
Namespace
基本上只是一个基本的 class,您可以在其实例上定义属性,但有一些细节:
__repr__
foo in Namespace(bar=3)
计算结果为False
)Namespace
实例相等。 (例如, Namespace(foo=3, bar=5) == Namespace(bar=5, foo=3)
) Namespace
的实例由parse_args
返回:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('bar')
args = parser.parse_args(['XXX'])
assert args.bar == 'XXX'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.