gpt4 book ai didi

python-3.x - Python 2.7 和 Python 3.5 中的 unicode_literals 和 doctest

转载 作者:行者123 更新时间:2023-12-03 02:00:22 24 4
gpt4 key购买 nike

考虑以下演示脚本:

# -*- coding: utf-8 -*-
from __future__ import division
from __future__ import unicode_literals

def myDivi():
"""
This is a small demo that just returns the output of a divison.
>>> myDivi()
0.5
"""
return 1/2

def myUnic():
"""
This is a small demo that just returns a string.
>>> myUnic()
'abc'
"""
return 'abc'

if __name__ == "__main__":
import doctest
extraglobs = {}
doctest.testmod(extraglobs=extraglobs)

doctest 在 Python 3.5 上通过,但在 Python 2.7.9 上失败。
奇怪的是,除法测试有效,但 unicode 测试失败。

我看到了各种问题,包括以下

但它们都有些不同(例如它们已经过时(指 Py 2.6 或 Py 3.0),导入语句位于 doctest 内而不是全局,使用 pytest 而不是标准 doctest,切换到不同的断言等)
尽管如此,我还是根据这些问题尝试了各种替代方案,包括例如

if __name__ == "__main__":
import doctest
import __future__
extraglobs = {'unicode_literals': __future__.unicode_literals}
doctest.testmod(extraglobs=extraglobs)

def myUnic():
"""
This is a small demo that just returns a string.
>>> myUnic()
u'abc' # doctest: +ALLOW_UNICODE
"""
return 'abc'

但它仍然无法工作,无论是在 Python 2 或 3 上还是给出其他错误。
有没有办法让它在 3.5+ 和 2.7.9+ 上都通过,而不需要丑陋的 hack?我还使用这些文档字符串来生成文档,因此我更愿意或多或少地保留它们的原样。

最佳答案

这可以完成纯 doctest 的工作:

if __name__ == "__main__":
import doctest, sys, logging, re
from doctest import DocTestFinder, DocTestRunner
# Support print in doctests.
L_ = logging.getLogger(":")
logging.basicConfig(level=logging.DEBUG)
pr = print = lambda *xs: L_.debug(" ".join(repr(x) for x in xs))

# Make doctest think u"" and "" is the same.
class Py23DocChecker(doctest.OutputChecker, object):
RE = re.compile(r"(\W|^)[uU]([rR]?[\'\"])", re.UNICODE)

def remove_u(self, want, got):
if sys.version_info[0] < 3:
return (re.sub(self.RE, r'\1\2', want), re.sub(
self.RE, r'\1\2', got))
else:
return want, got

def check_output(self, want, got, optionflags):
want, got = self.remove_u(want, got)
return super(Py23DocChecker, self).check_output(
want, got, optionflags)

def output_difference(self, example, got, optionflags):
example.want, got = self.remove_u(example.want, got)
return super(Py23DocChecker, self).output_difference(
example, got, optionflags)

finder = DocTestFinder()
runner = DocTestRunner(checker=Py23DocChecker())
for test in finder.find(sys.modules.get('__main__')):
runner.run(test)
runner.summarize()
  • 将 u“foo” 视为与“foo”相同
  • 运行 doctest 时使用 print("foo") 或 pr("foo") 进行调试。仅当您仅使用 print 进行调试时,这才有效。

其中大部分是我从我不记得的地方偷来的。感谢这些互联网无名英雄。

关于python-3.x - Python 2.7 和 Python 3.5 中的 unicode_literals 和 doctest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42158733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com