为了交互式地测试我的 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()
对象支持包含测试;如果命名空间实例具有属性 namendattrname
,则'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/