2010-10-20 29 views
4

所有,python serval變量組合成字典?

類:

class foo(): 
    def __init__(self): 
     self.avar1 = 0 
     self.bvar2 = 1 
     self.cvar3 = 3 
    def debug_info(self): 
     print "avar1:" avar1 
     print "bvar2:" bvar2 
     print "cvar3:" cvar3 

我的問題,實在是太複雜寫DEBUG_INFO(),如果我得到了很多self.vars 的,那麼我想他們遷移到快譯通然而把它們打印一氣呵成用於調試和監控的目的,也許我不想丟失格式

foo.avar1 = 0 

訪問類內的增值經銷商,因爲它很容易閱讀和易於使用的並修改。你有沒有更好的主意,而不是去上課。 dict爲debug_info輸出?還是有人知道更好的方法讓這個類更簡單?

謝謝!

回答

3
def debug_info (self): 
    for (key, value) in self.__dict__.items(): 
     print(key, '=', value) 
+0

有點整潔和更Pythonic是使用變量(自我),國際海事組織。但也可以看下面關於使用插槽的對象的註釋,爲此使用dir(self)並從結果中選擇是必要的。 – andybuckley 2010-10-20 14:42:50

1

模塊,類和實例都__dict__,所以你可以參考它的情況下,你想顯示的調試:

>>> f = foo() 
>>> f.__dict__ 
{'bvar2': 1, 'cvar3': 3, 'avar1': 0} 
2

每個Python對象已經有這樣一本字典它是self.__dict__打印效果和其他Python字典相似,但是您可以在Python標準庫中使用Data pretty printer來控制格式的循環遍歷字典中的元素並打印它們,但是您需要如下所示:

class foo(): 
    def __init__(self): 
     self.avar1 = 0 
     self.bvar2 = 1 
     self.cvar3 = 3 
    def debug_info(self): 
     for k in self.__dict__: 
      print k + ':' + str(self.__dict__[k]) 


>>> foo().debug_info() 
bvar2:1 
cvar3:3 
avar1:0 
+0

您的示例輸出與您的代碼不匹配。 – poke 2010-10-20 15:29:49

+0

@poke感謝您注意到錯誤,輸出來自不同版本的解決方案,只是打印字典。 – 2010-10-20 15:44:12

1

在使用__dict__將在大多數情況下,它不會永遠工作 - 特別是對於具有__slots__變量對象。

相反,請嘗試以下操作:

vars = [var for var in dir(obj) if not callable(getattr(obj, var)) and not var.startswith('__')] 
1

其他人已經回答了你的關於打印的問題。如果要在__init__方法中設置很多變量,則還可以使用__dict__來縮短該方法的時間。如果你有很多變數,這至少會讓你不必一直輸入self。我認爲標準方式在大多數情況下更具可讀性,但是您的里程可能會有所不同。

def __init__(self): 
    vars = dict(avar1=0, bvar2=1, cvar3=3) 
    self.__dict__.update(vars) 
+0

我不會建議這樣做;它完全隱藏了對象中的哪些變量可用,並將所有信息壓縮成小塊。另外,這對問題沒有幫助,因爲當對象變量改變它的值時,'vars'不會被更新。 – poke 2010-10-20 15:32:05