2017-07-16 36 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) 

然後,您應該可以像以前一樣運行腳本的其餘部分。

相關問題