我們試圖重構和修改一個Python程序,以便它能夠獲取用戶定義的JSON文件,解析該文件,然後執行基於工作流的工作流根據用戶需要並在JSON中定義的選項。所以基本上,用戶必須用JSON指定一個字典,當這個JSON文件被Python程序解析時,我們獲得一個Python字典,然後我們將它作爲參數傳入一個我們在頂層模塊中實例化的類。總而言之,當python程序運行時,用戶定義的JSON字典最終會被添加到實例命名空間中。來自「Hashable」屬性問題的代碼挑戰
實現上下文管理器來解析JSON輸入對我們來說不是問題。但是,我們有一個要求,即可以使用JSON字典(隨後將其添加到實例名稱空間中)和generate multiple lines from a Jinja2 template file using looping within a template。我們試圖使用這條線在JSON的鍵值對之一:
"extra_scripts" : [["Altera/AlteraCommon.lua",
"Altera/StratixIV/EP4SGX70HF35C2.lua"]]
,這是坐在一個大字典對象,姑且稱之爲option_space_dict
和這個例子簡單,它只有4鍵值對(假設"extra_scripts"
是'key4'
這裏),雖然我們的節目,這是更大的:
option_space_dict = {
'key1' : ['value1'],
'key2' : ['value2'],
'key3' : ['value3A', 'value3B', 'value3C'],
'key4' : [['value4A', 'value4B']]
}
這是由這一行解析:
import itertools
option_space = [ dict(itertools.izip(option_space_dict, opt)) for opt in itertools.product(*option_space_dict.itervalues()) ]
得到基本上從option_space_dict
不同之處在於它是有點像option_space
:
[
{ 'key1' : 'value1',
'key2' : 'value2',
'key3' : 'value3A'
'key4' : ['value4A', 'value4B'] },
{ 'key1' : 'value1',
'key2' : 'value2',
'key3' : 'value3B'
'key4' : ['value4A', 'value4B'] },
{ 'key1' : 'value1',
'key2' : 'value2',
'key3' : 'value3C'
'key4' : ['value4A', 'value4B'] }
]
所以我們產生option_space
我們很好的東西,我們想用的Jinja2模板做。
# ignore self.option as it is not relevant to the issue here
def getOptionCompack(self) :
return [ (k, v) for k, v in self.option.iteritems() if set([v]) != set(self.option_space_dict[k])]
我從那個的key4
值包含的事實而產生的誤差TypeError: unhashable type: 'list'
:但是,爲了得到這一點,我們添加到option_space_dict
的key4
關鍵在做的程序所引起的問題在其他地方嵌套列表結構,這是'不可能'。
所以我們有點碰壁。有沒有人有我們如何克服這個問題的建議;能夠通過這種方式指定我們的JSON文件來完成我們想要的Jinja2,同時仍然能夠以相同的格式解析數據結構?
非常感謝!
定義一種將列表轉換爲字符串並將其用於比較/散列的方法?例如'''.join(sorted(my_list))''? – 2014-12-04 10:45:39