2017-07-16 37 views
0

我做了一个Python亚军程序和包装,像这样:有没有一种方法可以将argseparse模块转换为某种类型的对象?

亚军程序接受来自命令行参数,并使用argseparse解析它们,如:

parser = argparse.ArgumentParser()  
parser.add_argument(... 
parser.add_argument(... 
args = parser.parse_args() 

然后将它们发送到我的这样的封装模块:

packageObject = PackageModule(params=args) 

现在我正在做这个成一个程序,不命令行参数走,但我想保持与同一行初始化的PackageObject。

我怎样才能像,

args =() 
args.arguments_1 = 'user_name' 

+0

''argparse.Namespace',它是'parse_args'返回的对象的类型,与'class Namespace:pass'没有太大区别。 – chepner

回答

0

你可以定义一个新的类来存储的参数状态:

class Args(object): 
    def __init__(self, arg1, arg2): 
     self.arg1 = arg1 
     self.arg2 = arg2 

args = Args('user_name', 'something else') 
packageObject = PackageModule(params=args) 

如果您要创建多个args情况下,你可以考虑在类定义使用__slots__,因为你不会被分配在实例的新属性,也使实例ligthweight:

class Args(object): 
    __slots__ = ['arg1', 'arg2'] 
    def __init__(self, arg1, arg2): 
     self.arg1 = arg1 
     self.arg2 = arg2 
+1

如果使用> = Python 3.3,他们可以使用['types.SimpleNamespace'](https://docs.python.org/3/library/types.html#types.SimpleNamespace),它可以避免模板化,更像是'argparse.Namespace',如果他们调用'print'的话。 – SethMMorton

0

有几种解决方案:

  1. 充分利用PackageModule对象接受参数,并解压参数对象PackageModule(**vars(args))
  2. 只是做一个轻量级namedtuple
  3. 做一个轻量级类
  4. 通ARGS作为一个字典params=vars(args),以及替代普通字典
0

你可以提供一个列表argparse.parse_args(),并不需要来自于命令行:

args_list = ['-n', '10', 'hello'] 
args = parser.parse_args(args_list) 

然后,您应该可以像以前一样运行脚本的其余部分。

相关问题