2014-03-29 82 views
1

Python的print語句經常用於任意數據結構(特別是由argparse.Namespace創建的),這很有用。一種情況是,它不起作用的地方是處理包含循環的複雜對象圖(一個對象指向另一個,指向原始對象);這會嘗試將對象轉換爲字符串時出現無限遞歸。打印循環數據結構

有沒有辦法創建一個字符串表示,適合打印出於調試目的,檢查週期,因此可以處理任意對象圖? (Python 2.7版,如果它的事項)

+1

不知道你問什麼。創建檢查週期的字符串表示的方法是檢查字符串表示形式代碼中的週期。看看Python打印什麼,例如,當你執行'a = [1]'然後'a [0] = a'並打印結果列表。具體怎麼處理這取決於你的字符串表示代碼是如何工作的,你不用在你的問題中描述。 – BrenBarn

+0

@BrenBarn啊!你是對的,列表的字符串轉換已經正確地處理週期;這是argparse.Namespace的字符串轉換,它沒有。我想我的問題是,是否有人已經編寫了argparse.Namespace的字符串轉換代碼來處理循環,如果是這樣,爲了節省我的重新發明輪子? – rwallace

+1

我不知道任何。 – BrenBarn

回答

0

好吧,我寫我自己的函數用於印刷argparse.Namespace對象,可直接或間接地引用循環數據結構:

def pr(a): 
    print 'Namespace' 
    seen = set() 
    def f(a, indent): 
     for k, v in sorted(a.__dict__.items()): 
      s = indent * ' ' 
      if type(v) == argparse.Namespace: 
       if id(v) in seen: 
        print '%s%s: Namespace' % (s, k) 
       else: 
        seen.add(id(v)) 
        print '%s%s:' % (s, k) 
        f(v, indent + 1) 
      elif type(v) == bytearray: 
       print '%s%s: bytearray(%s)' % (s, k, len(v)) 
      elif type(v) == list: 
       print '%s%s: [%s]' % (s, k, len(v)) 
      elif type(v) == str: 
       print '%s%s: %s' % (s, k, repr(v)) 
      elif type(v) == tuple: 
       print '%s%s: (%s)' % (s, k, len(v)) 
      elif type(v) in (int, long): 
       print '%s%s: %x' % (s, k, v) 
      else: 
       print '%s%s: %s' % (s, k, v) 
    f(a, 1)