Hai,
Saat mengganti variabel s ke nilai lain u '\ xff' , pengujian ini akan gagal.
[Kasus cobaan]
@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")
[melacak kembali]
UnicodeEncodeError: 'ascii' codec tidak dapat menyandikan karakter di posisi 0-4: ordinal tidak dalam kisaran (128)
[komentar]
Titik buggy terletak di fungsi '_encode' di utils.py, Anda tidak boleh hanya mentransmisikan msg ke str dengan menggunakan 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
Ada yang peduli?
Ya, tampaknya mengubah return str(msg)
menjadi return msg
menyelesaikan masalah tanpa merusak tes. Tetapi mengapa pemeran ini diperlukan sejak awal?
Saya tidak sepenuhnya yakin masuk akal untuk mengubah ini sekarang. Ini tidak akan benar-benar merusak kode siapa pun, tetapi pada dasarnya memungkinkan Anda puts
hal-hal yang bukan string dan mengeluarkan sesuatu yang masuk akal:
>>> 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
Saya menduga ada kode di luar sana yang menggunakan ini (putus asa untuk mencari ini di github, jadi tidak akan mencoba mencari contoh).
Saya tidak yakin saya pikir itu benar bahwa tidak memiliki set pengkodean dan menggunakan unicode akan menyebabkan puts
membuat kita crash.
Curigai cara paling buruk untuk mengatasi hal ini untuk saat ini adalah dengan memperluas baris yang melanggar ke dalam blok ini:
try:
return str(msg) # Original behavior added for 'reasons'
except UnicodeDecodeError:
return msg # Best-effort fallback
Dengan cara ini, apa pun alasan kuno yang kami miliki untuk melakukan casting-to-string akan terus berfungsi, tetapi kasus buggy yang sedang dibahas akan kembali ke "yah, saya tidak tahu apa ini, tetapi saya tidak bisa str()
itu , jadi saya hanya akan mendorongnya ke pipa apa adanya ".
Saya mengalami masalah serupa saat menjalankan metode sudo
, dan pengecualian terjadi pada self.stream.write(text)
dalam io.py
. Apakah ada kemajuan dalam masalah unicode?
Komentar yang paling membantu
Ada yang peduli?