Ne yapıldığından itibaren, en azından python yorumlayıcısının çıktısını taklit eden çok basit bir biçimlendirme ile güzel bir yazıcı görmüyorum, böylece benim:
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)
Başlamak için:
pretty = Formatter()
Tanımlanmış türler için biçimlendiricilerin eklenmesini destekleyebilir, bunun için böyle bir işlev yapmanız ve set_formater ile istediğiniz türe bağlamanız yeterlidir:
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)
Tarihsel nedenlerden ötürü, bir sınıf yerine bir işlev olan önceki güzel yazıcıyı saklıyorum, ancak her ikisi de aynı şekilde kullanılabilir, sınıf sürümü sadece çok daha fazlasına izin verir:
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)
Kullanmak için:
>>> 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'
}
Diğer sürümlerle karşılaştırıldığında:
- Bu çözüm doğrudan nesne türünü arar, böylece sadece liste veya dikte değil, hemen hemen her şeyi yazdırabilirsiniz.
- Hiç bağımlılığı yok.
- Her şey bir dizenin içine konur, böylece onunla ne istersen yapabilirsin.
- Sınıf ve işlev test edilmiştir ve Python 2.7 ve 3.4 ile çalışır.
- İçinde her türlü nesneye sahip olabilirsiniz, bu onların temsilidir ve sonuca konan içerikleri değildir (dize tırnak işaretleri içerir, Unicode dize tamamen temsil edilir ...).
- Sınıf sürümü ile, istediğiniz her nesne türü için biçimlendirme ekleyebilir veya bunları önceden tanımlanmış olanlar için değiştirebilirsiniz.
- anahtarı geçerli herhangi bir türde olabilir.
- Girinti ve Newline karakteri istediğimiz her şey için değiştirilebilir.
- Diksiyon, Liste ve Tuples oldukça basılır.