যা করা হয়েছে তা হিসাবে, আমি এমন কোনও প্রিন্টার দেখতে পাচ্ছি না যা অন্তত খুব সাধারণ বিন্যাসের সাথে পাইথন ইন্টারপ্রেটারের আউটপুটকে নকল করে তাই এখানে আমার:
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()
এটি সংজ্ঞায়িত ধরণের জন্য বিন্যাস সংযোজনকে সমর্থন করতে পারে, আপনাকে কেবল এই জাতীয়টির জন্য একটি ফাংশন তৈরি করতে হবে এবং সেট_ফর্মটারের সাথে এটি টাইপ করতে হবে যা আপনি পছন্দ করতে পারেন:
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)
Reasonsতিহাসিক কারণে, আমি পূর্ববর্তী সুন্দর প্রিন্টারটি রাখি যা ক্লাসের পরিবর্তে একটি ফাংশন ছিল, তবে সেগুলি উভয়ই একইভাবে ব্যবহার করা যেতে পারে, শ্রেণি সংস্করণটি আরও অনেক বেশি অনুমতি দেয়:
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'
}
অন্যান্য সংস্করণের তুলনায়:
- এই সমাধানটি সরাসরি অবজেক্টের ধরণের জন্য দেখায়, তাই আপনি প্রায় সমস্ত কিছু মুদ্রণ করতে পারেন, কেবল তালিকা বা ডিক নয়।
- কোন নির্ভরতা নেই।
- সবকিছু একটি স্ট্রিংয়ের ভিতরে রাখা হয়, যাতে আপনি এটি দিয়ে যা করতে পারেন তা করতে পারেন।
- ক্লাস এবং ফাংশনটি পরীক্ষা করা হয়েছে এবং পাইথন ২.7 এবং ৩.৪ এর সাথে কাজ করে।
- আপনার ভিতরে সমস্ত ধরণের অবজেক্ট থাকতে পারে, এটি তাদের উপস্থাপনা এবং ফলাফলগুলির মধ্যে দেওয়া সামগ্রীর মতো নয় (সুতরাং স্ট্রিংয়ের উদ্ধৃতি রয়েছে, ইউনিকোড স্ট্রিং সম্পূর্ণরূপে উপস্থাপিত ...)।
- শ্রেণীর সংস্করণ সহ, আপনি आफूले চাইলে প্রতিটি বস্তুর জন্য ফর্ম্যাটিং যুক্ত করতে বা ইতিমধ্যে সংজ্ঞায়িতগুলির জন্য এগুলি পরিবর্তন করতে পারেন।
- কী কোনও বৈধ প্রকারের হতে পারে।
- আমাদের পছন্দ মতো প্রতিটি জিনিসের জন্য ইনডেন্ট এবং নিউলাইন চরিত্রটি পরিবর্তন করা যেতে পারে।
- ডিক্ট, তালিকা এবং টিপলসগুলি বেশ মুদ্রিত।