修改doctest中的全局变量

2024-05-28 21:17:03 发布

您现在位置:Python中文网/ 问答频道 /正文

doctest文档有a section about execution context。 我的理解是,对于每个docstring中的测试,模块中的全局参数是浅拷贝的,但是在docstring内的测试之间不会重置。在

基于这一描述,我认为以下医生会通过:

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

但是下面的测试通过了!在

^{pr2}$

似乎全局参数是跨docstring的测试共享的? 但只在函数调用中?在

为什么这是结果行为? 这是否与函数有一个独立于执行上下文的全局字典有关?在


Tags: 模块文档参数returndefcontextsectionfunction
1条回答
网友
1楼 · 发布于 2024-05-28 21:17:03

不完全是。虽然全局变量确实是浅层复制的,但是您实际看到的是全局变量的作用域(使用关键字global)以及它在Python中在模块级别上的实际操作方式。您可以通过在赋值(X = 2)之后的函数f中放入一个^{}来观察这一点。在

$ 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

是的,这个值确实是2f的范围内,但是让我们看看它的全局变量。让我们看看它们在当前帧和上一帧中的比较。在

^{pr2}$

啊哈,你可以看到它们实际上不是一回事,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,因为{}在这里的模块中是由f更改的,但不是在doctest模块的浅拷贝范围中),尽管它最初是从模块复制的,但是更改是没有反映回底层模块,因为这是global关键字的操作方式-在模块级别,而不是跨模块。在

相关问题 更多 >

    热门问题