2015-10-03 28 views
0

我有一個使用argparse的應用程序,它被最新版本的Python所破壞。我不能再改變子命令的默認值。針對超出Python 2.7.6的子分析器的Argparse set_defaults?

我的應用程序有各種模塊和可選的GUI。 GUI通過子命令調用模塊,並且有一個可以改變參數默認值的ini文件。

GUI已創建解析器和子解析器,傳遞由GUI用戶設置的參數。 ini文件中的選項可能會覆蓋子分析器中的默認值。

這項工作在2.7.6中,但由於argparse的明顯變化而被更高版本打破。

import argparse 

# create the top-level parser 
parser = argparse.ArgumentParser(prog='PROG') 
parser.add_argument('--foo', action='store_true', dest='_foo') 
subparsers = parser.add_subparsers(help='sub-command help') 

# create the parser for the "a" command 
parser_a = subparsers.add_parser('a', help='a help') 
parser_a.add_argument('--bar', type=int, default=0, dest='_bar') 

#use ini file to alter default 
d_ini = {'_bar': '1'} 
parser.set_defaults(**d_ini) 

# parse some argument lists 
print parser.parse_args(['a']) 

在蟒2.7.6此打印爲預期:

命名空間(_bar = 1,_foo =假)

但在以後的版本中,例如。 2.7.10它打印

命名空間(_bar = 0,_foo = FALSE)

我使用argparse不正確的,因爲如果這是一個Python的錯誤已經持續了幾現在發佈?

我是否需要在添加子分析器默認值之前處理ini文件?這比我現在的方法更麻煩,因爲它需要分別爲每個論點完成,而且還有很多。 ArgumentParser.set_defaults的python文檔明確指出:「解析器級別的默認值在使用多個解析器時可能特別有用」,所以如果這個設施已經被攻破,這是令人驚訝的。

回答

0

在這種情況下,解析器默認值必須應用於感興趣的子解析器。也就是說,在上面的代碼中,你應該有:

# set defaults on parser_a 
parser_a.set_defaults(**d_ini) 

parser設定的默認值不上分解析器設置默認值。相反,它設置頂級(全局)參數的默認值。爲什麼?通過這種方式,程序可以選擇--bar,並且對於多個子命令a,b,c也可以採用具有不同默認值的選項--bar

以前的行爲在2.7.6中也出現在3.3中,應該被認爲是一個bug。

+0

謝謝。值得注意的是,在改變與主命令共享參數的子命令的缺省方面,似乎存在一個懸而未決的問題,[link](http://bugs.python.org/issue9351) – BarryM

相關問題