- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
doctest 文档有 a section about execution context .我的解读是,模块中的全局变量是针对每个文档字符串中的测试进行的浅层复制,但不会在文档字符串中的测试之间重置。
根据该描述,我认为以下 doctests 会通过:
X = 1
def f():
"""Function F.
>>> X
1
>>> f()
2
>>> X
2
"""
global X
X = 2
return X
def g():
"""Function G.
>>> g()
1
>>> X
1
"""
return X
但是下面的测试通过了!
X = 1
def f():
"""Function F.
>>> X
1
>>> f()
2
>>> X
1
"""
global X
X = 2
return X
def g():
"""Function G.
>>> g()
2
>>> X
1
"""
return X
似乎全局变量在跨文档字符串的测试之间共享?但仅在函数调用中?
为什么会出现这种行为?这与具有独立于执行上下文的全局字典的函数有关吗?
最佳答案
不完全是。虽然全局变量确实是浅拷贝的,但您实际看到的是全局变量的作用域(使用关键字 global
)以及它在 Python 中的模块级别的实际操作方式。您可以通过在赋值 (pdb.set_trace()
) 之后立即在函数 f
中放入一个 X = 2
来观察这一点。
$ python -m doctest foo.py
> /tmp/foo.py(18)f()
-> return X
(Pdb) bt
/usr/lib/python2.7/runpy.py(162)_run_module_as_main()
-> "__main__", fname, loader, pkg_name)
/usr/lib/python2.7/runpy.py(72)_run_code()
-> exec code in run_globals
/usr/lib/python2.7/doctest.py(2817)<module>()
-> sys.exit(_test())
/usr/lib/python2.7/doctest.py(2808)_test()
-> failures, _ = testmod(m)
/usr/lib/python2.7/doctest.py(1911)testmod()
-> runner.run(test)
/usr/lib/python2.7/doctest.py(1454)run()
-> return self.__run(test, compileflags, out)
/usr/lib/python2.7/doctest.py(1315)__run()
-> compileflags, 1) in test.globs
<doctest foo.f[1]>(1)<module>()
-> f()
> /tmp/foo.py(18)f()
-> return X
(Pdb) pp X
2
是的,2
范围内的值确实是f
,但是我们来看看它的全局。让我们看看它们在当前帧和上一帧中的比较情况。
(Pdb) id(globals())
140653053803048 # remember this number, and we go up a frame
(Pdb) u
> <doctest foo.f[1]>(1)<module>()
-> f()
(Pdb) id(globals())
140653053878632 # the "shallow" clone
(Pdb) X
1
(Pdb) c
啊哈,你可以看到它们实际上不是一回事,X
确实是 1
并且没有被改变,因为那里的全局变量在 doctest 为此创建的 <doctest doc.f>
模块中。让我们继续。
(Pdb) id(globals())
140653053803048 # hey look, is the SAME number we remember
(Pdb) u
> <doctest foo.g[0]>(1)<module>()
-> g()
(Pdb) id(globals())
140653053872960 # note how this is a different shallow clone
所以你实际看到的是 doctest 中的全局变量与源代码中的全局变量不同(因此 g
将返回 2
因为 X
在此处的模块中确实被 f
更改了,但在 doctest 中没有模块浅拷贝范围),即使它最初是从模块复制的,但更改不会反射(reflect)回底层模块,因为这是 global
关键字的操作方式 - 在模块级别,而不是跨模块。
关于python - 在 doctests 中修改全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39238675/
我正在使用 doctest ,并且喜欢我可以从定义它们的地方测试非导出函数的事实: module Foo (frobnicate) where -- | -- >>> randomInt = 42 -
我有一个简单的 function with a doctest ,当使用 Sphinx 的 make doctest 运行时,出现以下错误: File "scheemey.rst", line ?,
文档似乎不太清楚如何解决以下问题...... def test(): """ >>> import doctest >>> doctest.ELLIPSIS_MARKER =
我通常使用 code auto-formatter Black ,它训练我使用双引号。使用双引号已成为我的“肌肉内存”。 许多类的默认 repr 使用单引号从 Python 交互式输出中打印出来。我知
我需要对一个必须用装饰器包装的方法进行文档测试,该装饰器不将 @functools.wraps 或 functools.update_wrapper 应用于被包装的方法.在这种情况下,doctest
我很困惑为什么 doctest.testmod() 以奇怪的顺序调用测试函数 from doctest import testmod def test_forwrite(): '''
import doctest def create_grid(size): grid = [] for i in range(size): row = ['0']*size
这可能是一个愚蠢的问题。 我正在尝试使用 python doctest,并且尝试运行 this示例 结尾为 if __name__ == "__main__": import doctest
我正在创建一个程序宏,它从一些配置文件自动生成一个库(这是一个寄存器布局,但这对问题并不重要)。 我希望库自动生成伴随自动库的文档,并包含应与 cargo test 一起运行的文档测试。现在,我已经实
这个问题在这里已经有了答案: How do you handle the "could not parse code block as Rust code" rustdoc warning? (1
我正在为一个模块编写文档,该模块具有一些由 Cargo 功能标志控制的选项。我想始终显示此文档,以便 crate 的消费者知道它可用,但我只需要在启用该功能时运行该示例。 库.rs //! This
我的函数从文件中读取,需要以独立于绝对路径的方式编写 doctest。编写 doctest 的最佳方法是什么?编写临时文件的成本很高,而且不是万无一失的。 最佳答案 您可以有一个采用路径的参数,用下划
如果我需要在 doctest 中做一些事情怎么办: ''' >>> for i in range(5): print i ''' 我明白了 for i in range(5):
我正在尝试通过 iex 使用 doctest 测试 HashSet。如果我运行下面的行,它会给出相同的结果,但是 #HashSet}无法在语法中表示。我想不出一种正确表示它的方法,也找不到任何例子。谢
我已经进行了搜索,但找不到我想要的东西。 我的代码如下: import datetime import doctest import os def parseOptions(): import
我有一个函数可以使用 random 模块将用户输入变量与随机生成的数字进行比较。我想写一个 doctest,它将要求忽略或覆盖随机生成的数字。 在我无知的情况下,我试图给随机变量赋值,但仍然生成了一个
测试这样的代码的最佳方法是什么(下面的代码显然失败了,因为每次都在不同的 block 中创建对象): def get_session(db_name, verbose, test): """Retur
我已经编写了一个用于测试的assert_raised 上下文管理器,它检查是否按预期引发异常,如果没有引发AssertionError。我还写了一个 doctest 来测试这个,但是 doctest
我有一个 doctest,我在其中测试 float 转换: >>> float('fish') 在 Python >> float('fish') ValueError:... 你可以看到 Alex
假设我有以下代码: def foo(s): """A dummy function foo. For example: >>> a = '''This is a test string lin
我是一名优秀的程序员,十分优秀!