10

私は次のようにdoctestを書いています:

>>> some_function(a=1, b=2)
{u'id': u'123', u'name': u'abc'}

これはPythonバージョン2.5、2.6、2.7では正常に機能しますが、Python 3では失敗し、次のエラーが発生します。

Expected:
    {u'id': u'123', u'name': u'abc'}
Got:
    {'id': '123', 'name': 'abc'}

問題は、私が次のようにドキュメントテストを作成した場合です。

>>> some_function(a=1, b=2)
{'id': '123', 'name': 'abc'}

これらはPython3でのみ機能し、Python2バージョンでは失敗します。私の質問は、どうすればクロスバージョン互換にすることができますか?

4

3 に答える 3

8

IPythonのdoctestで同じ問題が発生しました。きちんとした解決策はありませんが、すべてのu'プレフィックスを{}、でラップし{u}'、必要に応じてそれらを含めたり除外したりする小さな関数を作成しました。

u_format()関数それを使用したdoctestを見ることができます。

しかし、それはかなり厄介なので、私は多くのテストをdoctestsから移動しました。

または、次のようにテストできます。

>>> some_function(a=1, b=2) == {'id': '123', 'name': 'abc'}
True

キーにいくつかのUnicode文字列が必要な場合はu'abþ'、を使用し、distributeを使用2to3してdoctestを実行できます。ただし、これは入力コードでのみ機能し、出力reprsでは機能しません。

于 2012-11-20T13:21:28.510 に答える
4

pytestを使用する場合は、次のことを実行できます。

>>> some_function(a=1, b=2) # doctest: +ALLOW_UNICODE
{u'id': u'123', u'name': u'abc'}

また、Python 3を実行している場合は、uが削除され、Python2で保持されます。

于 2016-11-13T20:01:57.383 に答える
3

NLTKのdoctestsで同じ問題が発生しました。これは、カスタムnoseプラグインによってインストールされるカスタムdoctest出力チェッカー(u'foo'と'foo'を同じように扱う)を使用することで解決されました:https ://github.com/nltk/nltk/blob/develop/nltk /test/doctest_nose_plugin.py

このソリューションはきれいではありませんが、非常にうまく機能し(NLTKには約0.5メガバイトのdoctestがあります)、doctestの読みやすさを損なうことはありません。

編集:このnoseプラグインの簡略化されたスタンドアロンバージョンを見つけました:https ://github.com/gnublade/doctest-ignore-unicode

于 2012-12-04T18:18:09.510 に答える