2012-12-31 47 views
0

我試圖讓功能VisitAllObjects接受不同的文件,並返回一個字典。但是我目前所指的是同一個名字?所以一旦gdata運行,fdata就會變成gdata。我該如何做到這一點,所以fdata和gdata等於他們的gh5文件中的尊重數據?蟒蛇遞歸函數,返回非易變的字典

f = h5py.File('testfile.gh5', 'r') 
g = h5py.File('testfile2.gh5', 'r') 

def VisitAllObjects(Group,Path, FileInfo=None): 
    if FileInfo is None: 
     FileInfo = {} 
    for i in Group.items(): 
     if isinstance(i[1], h5py.Group): 
      VisitAllObjects(i[1], Path + '/' + i[0]) 
     else: 
      DatasetName = Path + '/' + i[0] 
      FileInfo[DatasetName] = (Group[DatasetName].shape, Group[DatasetName].dtype) 
    return FileInfo 

fdata = VisitAllObjects(f,'') 
gdata = VisitAllObjects(g,'') 

有了您的幫助,並呼籲在自身visit_all_objects我能得到這個工作時添加文檔信息。如果你看到這個請讓我知道什麼問題,我仍然需要檢查它更多,但使用FDATA和GDATA回來與不同的數據和fdata is gdata是假。謝謝。

我得到了它與以下工作:

def visit_all_objects(Group,Path, file_info=None): 
    if file_info is None: 
     file_info = {} 
    for i in Group.items(): 
     if isinstance(i[1], h5py.Group): 
      visit_all_objects(i[1], Path + '/' + i[0], file_info) 
     else: 
      DatasetName = Path + '/' + i[0] 
      file_info[DatasetName] = (Group[DatasetName].shape, Group[DatasetName].dtype) 
    return file_info 
+0

我們強烈建議您遵循[PEP-8](http://www.python.org/dev/peps/pep-0008/#prescriptive-naming-conventions),其中建議保留'CapWords'上課,並使用'lowercase_with_underscores'作爲函數和局部變量 - 它使您的代碼更容易一目瞭然。 (你可以看到它也會影響這裏的語法高亮)。 –

+0

(a)PEP8。找到它並閱讀它(b)「但是我現在指的是同一個名字?」意思。請提供示例輸入和輸出,並解釋它爲什麼是錯誤的。 – Marcin

+1

你正在做遞歸調用是無用的,因爲你不保存結果,只有最上面的值保存。 'fdata'不應該「變成」在你的例子'gdata'(雖然我不知道如何'h5py'的作品,但無論如何...)。您可能會看到相同的結果,因爲只考慮最頂層的元素。你有沒有看到它們是否是使用'is'運算符的同一個對象? – Bakuriu

回答

0

而是變異的字典,嘗試做一個新的,和突變所。你可以做到這一點通過把FileInfo = FileInfo.copy()附近的函數的頂部,之後你處理的情況下FileInfo is None