2015-02-05 50 views
13

要交互测试我的Python脚本,我想创建一个Namespace对象,类似于argparse.parse_args()将返回的对象。 最显而易见的方法,如何创建一个Python名称空间(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([("a",1),("b","c")]))一dict但我不能把它作为一个Namespace

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

回答

42

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

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

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

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

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

from argparse import Namespace 

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

前者简单的类实际上是types.SimpleNamespace:看到的是https://文档.python.org的/ dev /库/ types.html#types.SimpleNamespace。 – Ofer 2017-07-11 15:00:33

-2

argparse documentation表现出你想要做什么不同的例子:

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument("-a") 
parser.parse_args(['-a 12']) 
>>> Namespace(a=' 12') 
+0

不好,正如我在问题中解释的那样:一个小错误和repl是_dead_ – sds 2015-02-05 14:01:06

+0

这不会让您交互地测试使用'Namespace'实例的代码。 – 2015-02-05 14:01:10

+0

@sds我可能错过了'repl is dead'部分的问题,但这不是因为您使用的'ArgumentParser'缺少'add_argument'调用吗?我明白,你不想在你的测试中重新创建相同的'ArgumentParser',但它可以在测试中调用的一个单独的方法中创建,以便检索。 @MartijnPieters你不能这样创建'ArgumentParser',然后将它传递给你使用它的方法吗? 'my_method_using_arg_parse(fake_namespace) – bvidal 2015-02-05 14:10:50

相关问题