Về những gì đã được thực hiện, tôi không thấy bất kỳ máy in đẹp nào ít nhất bắt chước đầu ra của trình thông dịch python với định dạng rất đơn giản nên đây là của tôi:
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)
Để khởi tạo nó:
pretty = Formatter()
Nó có thể hỗ trợ thêm trình định dạng cho các kiểu đã xác định, bạn chỉ cần tạo một hàm cho kiểu như thế này và liên kết nó với kiểu bạn muốn với 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)
Vì lý do lịch sử, tôi giữ máy in đẹp trước đó là chức năng thay vì một lớp, nhưng cả hai đều có thể được sử dụng theo cùng một cách, phiên bản lớp chỉ đơn giản là cho phép nhiều hơn:
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)
Để dùng nó :
>>> 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'
}
So với các phiên bản khác:
- Giải pháp này tìm kiếm trực tiếp cho loại đối tượng, vì vậy bạn có thể in hầu hết mọi thứ, không chỉ liệt kê hoặc đọc chính tả.
- Không có bất kỳ sự phụ thuộc.
- Tất cả mọi thứ được đặt trong một chuỗi, vì vậy bạn có thể làm bất cứ điều gì bạn muốn với nó.
- Lớp và hàm đã được kiểm tra và hoạt động với Python 2.7 và 3.4.
- Bạn có thể có tất cả các loại đối tượng bên trong, đây là đại diện của chúng chứ không phải nội dung của chúng được đưa vào kết quả (vì vậy chuỗi có dấu ngoặc kép, chuỗi Unicode được thể hiện đầy đủ ...).
- Với phiên bản lớp, bạn có thể thêm định dạng cho mọi loại đối tượng bạn muốn hoặc thay đổi chúng cho các loại đã được xác định.
- khóa có thể là bất kỳ loại hợp lệ.
- Nhân vật thụt lề và dòng mới có thể được thay đổi cho mọi thứ chúng ta muốn.
- Dict, List và Tuples được in đẹp.