python - 如何创建 Python 命名空间(argparse.parse_args 值)?

标签 python namespaces argparse

为了交互式地测试我的 python 脚本,我想创建一个 Namespace 对象,类似于 argparse.parse_args() 返回的对象。 显而易见的方式,

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.parse_args()
Namespace()
>>> parser.parse_args("-a")
usage: [-h]
: error: unrecognized arguments: - a

Process Python exited abnormally with code 2

可能会导致 Python repl 退出(如上)一个愚蠢的错误。

那么,创建具有给定属性集的 Python 命名空间的最简单方法是什么?

例如,我可以即时创建 dict (dict([("a",1),("b","c")]) ) 但我不能将它用作 Namespace:

AttributeError: 'dict' object has no attribute 'a'

最佳答案

你可以创建一个简单的类:

class Namespace:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

当涉及到属性时,它的工作方式与 argparse Namespace 类完全相同:

>>> args = Namespace(a=1, b='c')
>>> args.a
1
>>> args.b
'c'

或者,只需导入类;它可以从 argparse 模块获得:

from argparse import Namespace

args = Namespace(a=1, b='c')

从 Python 3.3 开始,还有 types.SimpleNamespace ,它本质上做同样的事情:

>>> from types import SimpleNamespace
>>> args = SimpleNamespace(a=1, b='c')
>>> args.a
1
>>> args.b
'c'

这两种类型是不同的; SimpleNamespace主要用于sys.implementation属性和time.get_clock_info()的返回值。

进一步比较:

  • 这两个类都支持相等性测试;对于同一类的两个实例,如果它们具有相同的属性和相同的值,则 instance_a == instance_b 为真。
  • 这两个类都有一个有用的 __repr__ 来显示它们有哪些属性。
  • Namespace() 对象支持包含测试;如果命名空间实例具有属性 namend attrname,则 'attrname' in instance 为真。 SimpleNamespace 没有。
  • Namespace() 对象有一个未记录的 ._get_kwargs() 方法,该方法返回 (name, value) 属性的排序列表实例。您可以使用 sorted(vars(instance).items()) 为任一类获得相同的结果。
  • 虽然 SimpleNamespace() 用 C 实现,Namespace() 用 Python 实现,但属性访问并不快,因为两者都使用相同的 __dict__属性的存储。 SimpleNamespace() 实例的相等性测试和生成表示要快一些。

关于python - 如何创建 Python 命名空间(argparse.parse_args 值)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28345780/

相关文章:

python - 如何在 fork 进程中使用 ipdb.set_trace

python - 有时我的 pg_restore 或 mongorestore 会卡住

c++ - 在 ";"之前缺少 'namespace',在 ";"之前缺少 'using'

c++ - 如何将单个函数引入当前命名空间?

python - 子解析器 argparse "error: too few arguments"

python - 使用 EPD enthought 7.2 在 OS X 10.6.8 上安装 pygame

c# - 带有 Context.Handler 和 Server.Transfer 的命名空间?

python-3.x - pytest argparse 测试用例不起作用

python - 如何避免在 python 中使用特定的可选参数

python - 为什么在我的 python 代码中打印出 'None'