Fabric: UnicodeEncodeErrorを呼び出すと、puts関数がunicode u '\ xff'であり、stream.encodingがNoneです。

作成日 2015年04月08日  ·  5コメント  ·  ソース: fabric/fabric

こんにちは、
変数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")

[トレースバック]
UnicodeEncodeError: 'ascii'コーデックは位置0〜4の文字をエンコードできません:序数が範囲内にありません(128)

【コメント】
バグのあるポイントはutils.pyの関数 '_encode'にあります。str(msg)を使用して単純にmsgをstrにキャストしないでください。

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
Bug Needs investigation Needs patch

最も参考になるコメント

誰も気にしますか?

全てのコメント5件

誰も気にしますか?

うん、 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

これを使用するコードがあると思います(githubでこれを検索することはできませんので、例を探すつもりはありません)。

ただし、エンコーディングセットがなく、Unicodeを使用すると、 putsがクラッシュするのは正しいと思います。

今のところこれに対処するための最悪の方法は、問題のある行をこのブロックに単純に拡張することです。

try:
    return str(msg) # Original behavior added for 'reasons'
except UnicodeDecodeError:
    return msg # Best-effort fallback

このように、文字列へのキャストについて私たちが持っていた以前の理由は何でも機能し続けますが、議論中のバグのあるケースは「まあ、これが何であるかはわかりませんが、 str()できません、そのままパイプに押し込みます」

sudoメソッドの実行中に同様の問題が発生し、 io.py self.stream.write(text)で例外が発生しました。 Unicodeの問題に進展はありますか?

このページは役に立ちましたか?
0 / 5 - 0 評価
bleepcoder.com は、世界中の開発者にソリューションを提供するために、公にライセンスされた GitHub の情報を使用しています。弊社は、GitHub, Inc.をはじめ、GitHubを利用した開発者のプロジェクトとは提携しておりません。私たちは、私たちのサーバー上のビデオや画像をホストしていません。すべての権利はそれぞれの所有者に帰属します。
このページのソース: ソース

人気のあるプログラミング言語
GitHub の人気プロジェクト
その他の GitHub プロジェクト

© 2024 bleepcoder.com - Contact
Made with in the Dominican Republic.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.