2016-03-01 28 views
0

我試圖將我的參數從argparse分配給變量。我有兩個腳本,一個是解析器,另一個是模塊。當我嘗試分配一個變量時,我得到一個元組對象沒有屬性錯誤。任何指導將不勝感激。Python:使用argparse從函數(* args)分配變量

def main(): 
parser = argparse.ArgumentParser(description='A simple front end script interface') 
subparsers = parser.add_subparsers(help='(run various listed scripts..)', dest='mode') 

add_pyrr_command_options(subparsers) 
args = parser.parse_args() 

if args.mode == "pyrr": 
    pyrr.parse_cmds(args) 
else: 
    parser.print_usage() 

pyrr.py

def parse_cmds(*args): 
print(args) 
pass 
(Namespace(mode='pyrr', plugin_name='ntuser', reg_loc='/user/home', rip_loc='/user/some'),) 

當我試圖通過研究方法來分配變量(例如arg.plugin_name)我得到一個AttributeError: 'tuple' object has no attribute 'pyrr'

回答

1

所以argsNamespace對象

Namespace(mode='pyrr', plugin_name='ntuser', reg_loc='/user/home', rip_loc='/user/some') 

而隨着你的第一個腳本顯示你c使用args.mode

在(具有校正縮進)

def parse_cmds(*args): 
    print(args) 
    pass 

args是一個元組(因爲*args的),例如(Namespace(...),)。與普通args你可以繼續訪問mode

def parse_cmds(args): 
    args.mode 

另一種選擇是通過一本字典通過**kwargs

def parse_cmds(**vargs): 
    # vargs is a keyword dictionary 

parse_cmds(vars(args)) # converting namespace to dictionary 

我認爲你是在正確的軌道上。你只需要區分namespace對象,字典和元組。

在您的示例中,'pyrr'是字符串值args.mode,也是導入的pyrr.py模塊的名稱。

+0

使用匹配模塊名稱的字符串名稱通常不好嗎? – ImNotLeet

+1

只有當它困擾你! – hpaulj