รหัสนี้ไม่ถูกต้องเว้นแต่คุณจะรู้บางอย่างที่เราไม่ทราบ:
if isinstance(data, bytes):
data = data.decode()
คุณไม่ (ดูเหมือน) ทราบการเข้ารหัสของdata. คุณสมมติว่าเป็น UTF-8แต่นั่นอาจผิดพลาดได้ เนื่องจากคุณไม่ทราบว่าการเข้ารหัส, คุณไม่ได้มีข้อความ คุณมีไบต์ซึ่งอาจมีความหมายใด ๆ ภายใต้ดวงอาทิตย์
ข่าวดีก็คือลำดับแบบสุ่มส่วนใหญ่ของไบต์ไม่ใช่ UTF-8 ที่ถูกต้องดังนั้นเมื่อหยุดพักมันจะแตกเสียงดัง ( errors='strict'เป็นค่าเริ่มต้น) แทนที่จะทำสิ่งที่ผิดอย่างเงียบ ๆ ข่าวดียิ่งกว่านั้นก็คือลำดับแบบสุ่มส่วนใหญ่ที่เกิดขึ้นเป็น UTF-8 ที่ถูกต้องก็เป็น ASCII ที่ถูกต้องเช่นกันซึ่ง ( เกือบ ) ทุกคนเห็นด้วยกับวิธีการแยกวิเคราะห์
ข่าวร้ายก็คือไม่มีวิธีที่สมเหตุสมผลในการแก้ไขปัญหานี้ มีวิธีมาตรฐานในการให้ข้อมูลการเข้ารหัส: ใช้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ต้องเป็นอาร์กิวเมนต์แรก หากข้อ จำกัด เหล่านั้นใช้ไม่ได้ผลให้ใช้คำตอบอื่นแทน