sds*_*sds 43 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
Run Code Online (Sandbox Code Playgroud)
可能导致Python repl退出(如上所述)一个愚蠢的错误.
那么,使用给定属性集创建Python命名空间的最简单方法是什么?
例如,我可以动态创建dict
(dict([("a",1),("b","c")])
)但我不能将其用作Namespace
:
AttributeError: 'dict' object has no attribute 'a'
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 96
您可以创建一个简单的类:
class Namespace:
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
Run Code Online (Sandbox Code Playgroud)
argparse
Namespace
当涉及到属性时,它的工作方式与类完全相同:
>>> args = Namespace(a=1, b='c')
>>> args.a
1
>>> args.b
'c'
Run Code Online (Sandbox Code Playgroud)
或者,只需导入该类 ; 它可以从argparse
模块中获得:
from argparse import Namespace
args = Namespace(a=1, b='c')
Run Code Online (Sandbox Code Playgroud)
从Python 3.3开始,还有types.SimpleNamespace
一些基本上做同样的事情:
>>> from types import SimpleNamespace
>>> args = SimpleNamespace(a=1, b='c')
>>> args.a
1
>>> args.b
'c'
Run Code Online (Sandbox Code Playgroud)
这两种类型是截然不同的; SimpleNamespace
主要用于sys.implementation
属性和返回值time.get_clock_info()
.
进一步比较:
instance_a == instance_b
如果它们具有相同值的相同属性,则为true.__repr__
显示它们具有的属性.Namespace()
对象支持遏制测试; 'attrname' in instance
如果名称空间实例具有属性namend,则为true attrname
.SimpleNamespace
才不是.Namespace()
对象具有未记录的._get_kwargs()
方法,该方法返回(name, value)
该实例的已排序的属性列表.你可以使用相同的课程sorted(vars(instance).items())
.SimpleNamespace()
在C Namespace()
中实现并且在Python中实现,但属性访问并不快,因为它们__dict__
对属性使用相同的存储.对于SimpleNamespace()
实例,平等测试和生成表示的速度要快一些.现在建议从类型模块中使用SimpleNamespace。它的作用与已接受的答案相同,只是它会更快并且具有更多的内置函数,例如equals和repr。
from types import SimpleNamespace
sn = SimpleNamespace()
sn.a = 'test'
sn.a
# output
'test'
Run Code Online (Sandbox Code Playgroud)
首先创建一个字典,然后使用该字典创建命名空间:
from argparse import Namespace
x = {'a': 1, 'b': 2}
ns = Namespace(**x)
print(ns.a) #output 1
Run Code Online (Sandbox Code Playgroud)