जैसा कि किया गया है, मुझे ऐसा कोई सुंदर प्रिंटर दिखाई नहीं देता है जो कम से कम बहुत सरल स्वरूपण के साथ अजगर दुभाषिया के उत्पादन की नकल करता है:
class Formatter(object):
def __init__(self):
self.types = {}
self.htchar = '\t'
self.lfchar = '\n'
self.indent = 0
self.set_formater(object, self.__class__.format_object)
self.set_formater(dict, self.__class__.format_dict)
self.set_formater(list, self.__class__.format_list)
self.set_formater(tuple, self.__class__.format_tuple)
def set_formater(self, obj, callback):
self.types[obj] = callback
def __call__(self, value, **args):
for key in args:
setattr(self, key, args[key])
formater = self.types[type(value) if type(value) in self.types else object]
return formater(self, value, self.indent)
def format_object(self, value, indent):
return repr(value)
def format_dict(self, value, indent):
items = [
self.lfchar + self.htchar * (indent + 1) + repr(key) + ': ' +
(self.types[type(value[key]) if type(value[key]) in self.types else object])(self, value[key], indent + 1)
for key in value
]
return '{%s}' % (','.join(items) + self.lfchar + self.htchar * indent)
def format_list(self, value, indent):
items = [
self.lfchar + self.htchar * (indent + 1) + (self.types[type(item) if type(item) in self.types else object])(self, item, indent + 1)
for item in value
]
return '[%s]' % (','.join(items) + self.lfchar + self.htchar * indent)
def format_tuple(self, value, indent):
items = [
self.lfchar + self.htchar * (indent + 1) + (self.types[type(item) if type(item) in self.types else object])(self, item, indent + 1)
for item in value
]
return '(%s)' % (','.join(items) + self.lfchar + self.htchar * indent)
इसे आरंभ करने के लिए:
pretty = Formatter()
यह परिभाषित प्रकारों के लिए फॉर्मेटर्स को जोड़ने का समर्थन कर सकता है, आपको बस इसके लिए एक फ़ंक्शन बनाने की आवश्यकता है और इसे उस प्रकार से बाँधें जो आप set_formater के साथ चाहते हैं:
from collections import OrderedDict
def format_ordereddict(self, value, indent):
items = [
self.lfchar + self.htchar * (indent + 1) +
"(" + repr(key) + ', ' + (self.types[
type(value[key]) if type(value[key]) in self.types else object
])(self, value[key], indent + 1) + ")"
for key in value
]
return 'OrderedDict([%s])' % (','.join(items) +
self.lfchar + self.htchar * indent)
pretty.set_formater(OrderedDict, format_ordereddict)
ऐतिहासिक कारणों से, मैं पिछले सुंदर प्रिंटर को रखता हूं जो एक वर्ग के बजाय एक फ़ंक्शन था, लेकिन वे दोनों एक ही तरह से उपयोग किए जा सकते हैं, वर्ग संस्करण बस और अधिक अनुमति देते हैं:
def pretty(value, htchar='\t', lfchar='\n', indent=0):
nlch = lfchar + htchar * (indent + 1)
if type(value) is dict:
items = [
nlch + repr(key) + ': ' + pretty(value[key], htchar, lfchar, indent + 1)
for key in value
]
return '{%s}' % (','.join(items) + lfchar + htchar * indent)
elif type(value) is list:
items = [
nlch + pretty(item, htchar, lfchar, indent + 1)
for item in value
]
return '[%s]' % (','.join(items) + lfchar + htchar * indent)
elif type(value) is tuple:
items = [
nlch + pretty(item, htchar, lfchar, indent + 1)
for item in value
]
return '(%s)' % (','.join(items) + lfchar + htchar * indent)
else:
return repr(value)
इसके प्रयेाग के लिए :
>>> a = {'list':['a','b',1,2],'dict':{'a':1,2:'b'},'tuple':('a','b',1,2),'function':pretty,'unicode':u'\xa7',("tuple","key"):"valid"}
>>> a
{'function': <function pretty at 0x7fdf555809b0>, 'tuple': ('a', 'b', 1, 2), 'list': ['a', 'b', 1, 2], 'dict': {'a': 1, 2: 'b'}, 'unicode': u'\xa7', ('tuple', 'key'): 'valid'}
>>> print(pretty(a))
{
'function': <function pretty at 0x7fdf555809b0>,
'tuple': (
'a',
'b',
1,
2
),
'list': [
'a',
'b',
1,
2
],
'dict': {
'a': 1,
2: 'b'
},
'unicode': u'\xa7',
('tuple', 'key'): 'valid'
}
अन्य संस्करणों की तुलना में:
- यह समाधान सीधे ऑब्जेक्ट प्रकार के लिए दिखता है, इसलिए आप केवल सूची या तानाशाही ही नहीं, लगभग सब कुछ प्रिंट कर सकते हैं।
- कोई निर्भरता नहीं है।
- सब कुछ एक स्ट्रिंग के अंदर रखा जाता है, इसलिए आप इसके साथ जो चाहें कर सकते हैं।
- कक्षा और समारोह का परीक्षण किया गया है और पायथन 2.7 और 3.4 के साथ काम करता है।
- आपके अंदर सभी प्रकार की वस्तुएं हो सकती हैं, यह उनका अभ्यावेदन है, न कि उनकी सामग्री जो परिणाम में डाली जा रही है (इसलिए स्ट्रिंग में उद्धरण हैं, यूनिकोड स्ट्रिंग का पूरी तरह से प्रतिनिधित्व है ...)।
- वर्ग संस्करण के साथ, आप हर इच्छित प्रकार के लिए स्वरूपण जोड़ सकते हैं या पहले से परिभाषित लोगों के लिए उन्हें बदल सकते हैं।
- कुंजी किसी भी मान्य प्रकार की हो सकती है।
- इंडेंट और न्यूलाइन चरित्र को हमारे द्वारा पसंद की जाने वाली हर चीज के लिए बदला जा सकता है।
- डिक्ट, लिस्ट और ट्यूपल्स बहुत प्रिंटेड हैं।