أهلا،
عند استبدال المتغير s بقيمة أخرى u '\ xff' ، سيفشل هذا الاختبار.
[حالة اختبار]
@mock_streams('stdout')
def test_puts_with_encoding_type_none_output():
"""
puts() should print unicode output without a stream encoding
"""
s = u"string!" #<====== replace to u"\xff"
output.user = True
sys.stdout.encoding = None
puts(s, show_prefix=False)
eq_(sys.stdout.getvalue(), s + "\n")
[تتبع الأثر]
خطأ UnicodeEncode: لا يمكن لبرنامج الترميز 'ascii' ترميز الأحرف في الموضع 0-4: الترتيب الترتيبي ليس في النطاق (128)
[تعليقات]
تم تحديد موقع نقطة عربات التي تجرها الدواب في الوظيفة "_encode" في utils.py ، لا يجب عليك ببساطة تحويل الرسالة إلى str باستخدام str (msg).
def _encode(msg, stream):
if isinstance(msg, unicode) and hasattr(stream, 'encoding') and not stream.encoding is None:
return msg.encode(stream.encoding)
else:
return str(msg) #<========== buggy point
هل من أحد يهتم؟
نعم ، يبدو أن تغيير return str(msg)
إلى return msg
يحل المشكلة دون كسر الاختبارات. لكن لماذا كان هذا التمثيل ضروريًا في المقام الأول؟
لست متأكدًا تمامًا من أنه من المنطقي تغيير هذا الآن. لن يؤدي ذلك إلى كسر رمز أي شخص تمامًا ، ولكنه يتيح لك في الأساس puts
أشياء ليست سلاسل والحصول على شيء معقول:
>>> class Foo(object):
... def __str__(self): return "The best Foo in the world"
...
>>> from fabric.api import puts
>>> puts(Foo())
The best Foo in the world
أعتقد أن هناك رمزًا يستخدم هذا (يائسًا في البحث عن هذا في جيثب ، لذلك لن أحاول البحث عن أمثلة).
لست متأكدًا من أنني أعتقد أنه من الصحيح أن عدم وجود مجموعة تشفير واستخدام unicode سيؤدي إلى تعطلنا puts
.
اشتبه في أن الطريقة الأقل سوءًا لمعالجة هذا الآن هي ببساطة توسيع السطر المسيء إلى هذه الكتلة:
try:
return str(msg) # Original behavior added for 'reasons'
except UnicodeDecodeError:
return msg # Best-effort fallback
وبهذه الطريقة ، مهما كانت الأسباب التي سبقت الطقوس التي كانت لدينا في عملية الصب إلى السلسلة ، فستستمر في العمل ، ولكن قضية عربات التي تجرها الدواب قيد المناقشة ستعود إلى "حسنًا ، لا أعرف ما هو هذا ، لكن لا يمكنني str()
ذلك ، لذلك سأدفعه في الأنبوب كما هو ".
واجهت مشكلة مماثلة أثناء تشغيل طريقة sudo
، وحدث الاستثناء عند self.stream.write(text)
في io.py
. هل هناك أي تقدم بشأن قضايا يونيكود؟
التعليق الأكثر فائدة
هل من أحد يهتم؟