繁体   English   中英

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

[英]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__
  • 只能使用关键字 arguments 来实例化它,防止“匿名”属性。
  • 检查属性是否存在的便捷方法( 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM