2012-03-22 48 views
1

雙引號的行爲如果我定義一個字符串的字典中__str__和單VS在Python

d = {"5": 5} 

打印顯示器用單引號

>> print d 
>> {'5': 5} 

有沒有一種方法,使其與打印雙引號?

編輯:

完整的故事是我最初定義的樹作爲嵌套的字典和使用JSON轉移它的語言之間。然後我決定將這些字典包裝在一個類中,但是這打破了我在json中對其進行編碼的方法。

+12

爲什麼這是一個問題嗎? – 2012-03-22 21:07:53

+6

正確地做到這一點,覆蓋所有角落的情況下,將是很困難的。如果您實際上正在嘗試編寫JSON輸出,請使用'json'模塊。 – 2012-03-22 21:12:41

回答

9

是(假設你有json模塊):使用print

>>> import json 
>>> print json.dumps({'5': 5}) 
{"5": 5} 
>>> 

在報價的數量,Python docs說:

的字符串包含在雙引號,如果該字符串包含一個 單引號和雙引號,否則它包含在單引號 中。

+1

+1非常有創意地使用模塊json! – hochl 2012-03-22 21:12:53

+1

請注意,如果您的字典包含不是JSON序列化的類型(如「字節」),則這不起作用。 – dan04 2012-03-22 21:13:42

+0

更糟糕:它會假定所有的字典鍵都是字符串; 'print json.dumps({5:5})'給出'{「5」:5}'。這是由JSON標準決定的。 – 2012-03-22 21:16:53

1

是的:創建自己的函數遍歷字典,建立自己的字符串表示,然後打印。

另外,將其編碼爲JSON或YAML,它可能會做你想做的。

0

您可以創建字典類型的子類,定義自己的字符串表示:

class MyDict(dict): 
    def __repr__(self): 
     return "my representation" 

例如:

>>> d = MyDict() 
>>> d["5"] = 5 
>>> d 
my representation 
0

你可以這樣來做:

>>> d = {"5": 5} 
>>> for key,value in d.items(): 
    print('{{"{0}": {1}}}'.format(key,value)) 


{"5": 5} 

只需使用雙{如果要輸出{format方法。


下面是使用__str__方法的解決方案:

from __future__ import print_function 
from itertools import chain,izip,repeat 

class singleQuoteDict(dict): 
    def __str__(self): 
     return ''.join(chain(('{'), 
         (j for i in izip(
          chain([''],repeat(', ')), 
          ('"{0}": {1!r}'.format(key,value) for key,value in self.items())) 
         for j in i), 
         ('}'))) 


d = singleQuoteDict({"5": 5, "10": 10}) 
print(d) 

輸出:

{"10": 10, "5": 5} 
+0

使用'{{「{0}」:{1!r}}}''可以更好地確保值來自'repr()'而不是'str()'。 – 2012-03-22 21:18:49