20

ユニコード文字列を操作する必要があるコードに取り組んでいます。そのためのドキュメントテストを書こうとしていますが、問題があります。以下は、問題を説明する最小限の例です。

# -*- coding: utf-8 -*-
def mylen(word):
  """
  >>> mylen(u"áéíóú")
  5
  """
  return len(word)

print mylen(u"áéíóú")

まず、コードを実行して、期待される の出力を確認しますprint mylen(u"áéíóú")

$ python mylen.py
5

次に、doctest を実行して問題を確認します。

$ python -m
5
**********************************************************************
File "mylen.py", line 4, in mylen.mylen
Failed example:
    mylen(u"áéíóú")
Expected:
    5
Got:
    10
**********************************************************************
1 items had failures:
   1 of   1 in mylen.mylen
***Test Failed*** 1 failures.

mylen(u"áéíóú")では、5 に評価されることをどのようにテストできますか?

4

5 に答える 5

20

Unicode 文字列が必要な場合は、Unicode docstring を使用する必要があります! 気をつけてu

# -*- coding: utf-8 -*-
def mylen(word):
  u"""        <----- SEE 'u' HERE
  >>> mylen(u"áéíóú")
  5
  """
  return len(word)

print mylen(u"áéíóú")

テストに合格する限り、これは機能します。Python 2.x では、詳細な doctest モードを機能させるか、テストが失敗したときに正しいトレースバックを取得するために、さらに別のハックが必要です。

if __name__ == "__main__":
    import sys
    reload(sys)
    sys.setdefaultencoding("UTF-8")
    import doctest
    doctest.testmod()

注意!デバッグ目的でのみ setdefaultencoding を使用してください。doctest での使用は受け入れますが、本番コードのどこにも使用できません。

于 2009-11-14T15:10:33.817 に答える
6

Python 2.6.6 は Unicode 出力をよく理解していませんが、これは以下を使用して修正できます。

  • すでに説明したハックsys.setdefaultencoding("UTF-8")
  • unicode docstring (すでに上記でも言及されています。どうもありがとうございました)
  • ANDprintステートメント。

私の場合、このドキュメント文字列はテストが壊れていることを示しています:

def beatiful_units(*units):
    u'''Returns nice string like 'erg/(cm² sec)'.

    >>> beatiful_units(('erg', 1), ('cm', -2), ('sec', -1))
    u'erg/(cm² sec)'
    '''

「エラー」メッセージで

Failed example:
    beatiful_units(('erg', 1), ('cm', -2), ('sec', -1))
Expected:
    u'erg/(cm² sec)'
Got:
    u'erg/(cm\xb2 sec)'

を使用しprintて、それを修正できます。

def beatiful_units(*units):
    u'''Returns nice string like 'erg/(cm² sec)'.

    >>> print beatiful_units(('erg', 1), ('cm', -2), ('sec', -1))
    erg/(cm² sec)
    '''
于 2011-07-10T10:35:20.500 に答える
2

これは、Pythonの既知の、まだ解決されていない問題のようです。ここここで未解決の問題を参照してください。

当然のことながら、Python 3ではすべての文字列がUnicodeであるため、Python3で正常に機能するように変更できます。

def mylen(word):
  """
  >>> mylen("áéíóú")
  5
  """
  return len(word)

print(mylen("áéíóú"))
于 2009-11-14T06:16:27.977 に答える
1

私の解決策は、u'\xe1\xe9\xed\xf3\xfa' のような Unicode 文字をエスケープすることでした。読むのは簡単ではありませんでしたが、私のテストにはASCII以外の文字がいくつかしかなかったので、そのような場合は、「# n with tilde」のように、説明をコメントとして脇に置きました.

于 2009-11-15T00:54:06.553 に答える