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

2024-01-13

为了以交互方式测试我的 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 因愚蠢错误而退出(如上所述)。

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

例如,我可以创建一个dict飞行中(dict([("a",1),("b","c")]))但我不能用它作为Namespace:

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

附言。新的exit_on_error https://docs.python.org/3/library/argparse.html#exit-on-error选项看起来像是创建一个有前途的替代方案Namespace对象,但它是严重破损 https://github.com/python/cpython/issues/85427,显然是设计使然。


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

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

它的工作方式与argparse Namespaceclass 涉及到属性时:

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

或者,只需导入类;它可以从argparse module:

from argparse import Namespace

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

从 Python 3.3 开始,还有types.SimpleNamespace https://docs.python.org/3/library/types.html#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如果它们具有相同的属性和相同的值,则为 true。
  • 两个课程都有帮助__repr__来显示他们有什么属性。
  • Namespace()对象支持遏制测试;'attrname' in instance如果命名空间实例具有属性 namend,则为 trueattrname. SimpleNamespace才不是。
  • Namespace()对象有一个未记录的._get_kwargs()返回排序列表的方法(name, value)该实例的属性。您可以使用以下命令为任一类获得相同的结果sorted(vars(instance).items()).
  • While SimpleNamespace()是用C实现的并且Namespace()是用Python实现的,属性访问并不更快,因为两者使用相同的__dict__属性的存储。相等性测试和生成表示的速度要快一些SimpleNamespace()实例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建 Python 命名空间(argparse.parse_args 值)? 的相关文章

随机推荐