2012-06-11 82 views
0

我有一個容器類,我想用它來打印它中的所有元素。正確使用__repr __()在python中?

我想將它們打印到文件或控制檯。

我已經列出了元素(Patch)和容器類,如下所示和__repr__(self)
我不確定我是否理解__repr__()的用途,並且想知道這裏的用法是否正確。

class Patch: 
    def __init__(self, folder_name, file_name): 
     self.folder_name = folder_name 
     self.file_name = file_name 
     self.full_path = os.path.join(self.folder_name, self.file_name) 
     self.file_hash = md5_for_file(open(self.full_path, 'r')) 
     self.file_size = os.path.getsize(self.full_path) 

    def __repr__(self): 
     return "%s %s %s" % (self.file_name, self.file_hash, self.file_size) 

class PatchContainer: 
    def __init__(self): 
     self.patch_folder_dict = collections.OrderedDict() 
     self.patch_file_set = set() 
    def addPatch(self, patch): 
     if patch.file_name in self.patch_file_set: 
      print '*** Delete the file ', patch.full_path, ' ***' 
      return 
     self.patch_file_set.add(patch.file_name) 
     if not patch.folder_name in self.patch_folder_dict: 
      self.patch_folder_dict[patch.folder_name] = [patch] 
     else: 
      self.patch_folder_dict[patch.folder_name].append(patch) 

    def prettyPrint(self, writeable_object=PATCH_META_FILE): 
     sys.stdout = writeable_object 
     for patch_folder in self.patch_folder_dict.keys(): 
      print patch_folder 
      patch_list = self.patch_folder_dict[patch_folder] 
      for patch in patch_list: 
       print patch 
     sys.stdout = sys.__stdout__ 

它按預期工作,但請評論風格/用法是否正常。

回答

4

這看起來像你可能想要__str__。他們是相似的,但__str__返回用於人類消費的東西; __repr__應該返回一些用於Python消費的東西 - 它應該是一個Python表達式,它將評估爲一個平等的對象,或者像尖括號中的東西,比如默認的<classname object at id>。見documentation爲內置repr(object),這結束調用object.__repr__()

對於許多類型,這個功能使得試圖返回一個字符串傳遞給eval時 將產生一個對象具有相同的值() 否則表示是封閉在與 附加信息

+5

雷蒙德赫廷傑(@raymondh)在推特上的主題有一天:「如果可能,'__repr__'方法應該顯示一個對象是如何構造的。不變式應該是:'eval(repr(obj))== obj'」。 –

+0

prettyPrint()函數怎麼樣?我可以定義PatchContainer的__str()__而不是prettyPrint。 – eugene

+0

@Eugene是的。這樣做可能會更有意義,所以,如果你這樣做,而不是調用'patchcontainer.prettyprint(file)',你將會執行'print >>文件patchcontainer'(或'print(patchcontainer,file = file)' 'from __future__ import print_function')。將業務級別與執行IO的代碼分開幾乎總是一個好主意。 – lvc

2

這是所述對象的人類可讀表示包含該對象的類型的名稱一起尖括號 的字符串。

  • 「Python的__repr__的目的」:clicky
  • 「差異與__repr__之間__str__在Python」:clicky
  • Python文檔:clicky