এই কোডটি সঠিক নয় যতক্ষণ না আপনি কিছু জানেন যা আমরা করি না:
if isinstance(data, bytes):
data = data.decode()
আপনি এর এনকোডিং জানেন না (প্রদর্শিত হবে) data। আপনি ধরে নিচ্ছেন এটি ইউটিএফ -8 , তবে এটি খুব ভাল হতে পারে। যেহেতু আপনি এনকোডিং জানেন না, তাই আপনার পাঠ্য নেই । আপনার বাইট রয়েছে, যা সূর্যের নিচে কোনও অর্থ হতে পারে।
সুসংবাদটি হ'ল বাইটগুলির সর্বাধিক এলোমেলো ক্রমগুলি বৈধ ইউটিএফ -8 বৈধ নয়, সুতরাং যখন এই বিরতি ঘটে তখন এটি errors='strict'নিঃশব্দে ভুল কাজটি করার পরিবর্তে উচ্চস্বরে ( ডিফল্ট হয়) ভেঙে যায় । আরও ভাল খবরটি হ'ল যে সমস্ত র্যান্ডম সিকোয়েন্সগুলি বৈধ ইউটিএফ -8 হিসাবে দেখা যায় সেগুলি বেশিরভাগই বৈধ এএসসিআইআই, যা ( প্রায় ) প্রত্যেকেই যেভাবে যেভাবে পার্স করতে পারে তাতে সম্মত হয়।
খারাপ খবরটি হ'ল এটি ঠিক করার কোনও যুক্তিসঙ্গত উপায় নেই। এনকোডিং তথ্য সরবরাহের একটি মানক উপায় রয়েছে: strপরিবর্তে ব্যবহার করুন bytes। যদি কিছু তৃতীয় পক্ষের কোড আপনাকে কোনও প্রসঙ্গ বা তথ্য ছাড়াই কোনও জিনিস bytesবা bytearrayবস্তু হস্তান্তর করে তবে কেবলমাত্র সঠিক পদক্ষেপ ব্যর্থ হওয়া।
এখন ধরে নেওয়া, আপনি এনকোডিং জানেন কিনা, আপনি functools.singledispatchএখানে ব্যবহার করতে পারেন :
@functools.singledispatch
def foo(data, other_arguments, ...):
raise TypeError('Unknown type: '+repr(type(data)))
@foo.register(str)
def _(data, other_arguments, ...):
@foo.register(bytes)
@foo.register(bytearray)
def _(data, other_arguments, ...):
data = data.decode('encoding')
return foo(data, other_arguments, ...)
এটি পদ্ধতিতে কাজ করে না এবং dataএটি প্রথম যুক্তি হতে হবে। যদি এই বিধিনিষেধগুলি আপনার পক্ষে কাজ করে না, তবে পরিবর্তে অন্য যে কোনও একটি উত্তর ব্যবহার করুন।