gpt4 book ai didi

python - 运行时范围和 `main` 符号在函数内部或外部不同

转载 作者:行者123 更新时间:2023-12-01 08:36:19 34 4
gpt4 key购买 nike

我正在阅读 code for testing in TensorFlow ,由 the tests in the MNIST official model 调用。该文件包含这些没有范围修饰符的行:

from unittest import *
unittest_main = main

这个函数,也没有范围修饰符:

def g_main(argv):
"""Delegate to unittest.main after redefining testLoader."""
...
return unittest_main(argv=argv)

并且main函数调用g_main:

def main(argv=None):  # pylint: disable=function-redefined
def main_wrapper():
args = argv
if args is None:
args = sys.argv
return app.run(main=g_main, argv=args)
benchmark.benchmarks_main(true_main=main_wrapper)

这似乎是循环的:main 调用 g_main,后者又调用 main。因此,我在 unittest_main = main 的定义下面和 g_main 函数内部添加了一些打印:

unittest_main = main
#Added by me:
print(unittest_main)
print(main)
for local_var in list(locals()):
if not local_var.startswith('__'): print(local_var)


# pylint: disable=invalid-name
# pylint: disable=undefined-variable
def g_main(argv):
"""Delegate to unittest.main after redefining testLoader."""
# Added by me:
for local_var in list(locals()):
if not local_var.startswith('__'): print(local_var)

print(unittest_main)
print(main)
return unittest_main(argv=argv)

运行python models/official/mnist/mnist_test.py,我得到:

absolute_import
division
print_function
atexit
...
unittest_main
<class 'unittest.main.TestProgram'>
<class 'unittest.main.TestProgram'>
argv
<class 'unittest.main.TestProgram'>
<function main at 0x11e55ff28>

因此,在函数 g_main 外部或内部调用时,main 符号的定义会发生变化,并且运行时作用域也不同。这是如何工作的?

最佳答案

有两个不同 main s float (好吧,main 在中间文件中重新定义)。

from unittest import *
unittest_main = main

简单地分配unittest.main名字unittest_main .

后来他们重新定义 main就这样:

def main(argv=None):  # pylint: disable=function-redefined
def main_wrapper():
args = argv
if args is None:
args = sys.argv
return app.run(main=g_main, argv=args)
benchmark.benchmarks_main(true_main=main_wrapper)

这意味着名称main现在指的是上面的函数而不是 unittest.mainunittest_main仍然是 unittest.main然而。

你的指纹也告诉了你这一点。第一次打印main (重新定义之前),它打印 <class 'unittest.main.TestProgram'> 。下一次,它输出 <function main at 0x11e55ff28> (因为它现在不再是 unittest.main 并且已按上述方式重新定义)。

g_main仅引用名称unittest_main这又是 unittest.main .

我认为如果他们这样做的话会更好 import unittest ,引用unittest.main (而不是将其重命名为 unittest_main )并完成它。那么就不需要重新定义名称 main 。此外,他们不会用 unittest 中的所有内容污染当前的命名空间。 (出于多种原因,您不想import *,这是其中之一)。他们违反了自己的风格指南和 PEP8...并使其变得更加困惑。

疯狂猜测:有人懒惰地做了from unittest import *当 tensorflow 还是个小婴儿时,还没有意识到后果,它就从那时起滚雪球般地滚雪球。

HTH。

关于python - 运行时范围和 `main` 符号在函数内部或外部不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53710303/

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