为了以交互方式测试我的 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
Namespace
class 涉及到属性时:
>>> 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(使用前将#替换为@)