我正在阅读TensorFlow中的测试代码,该代码由MNIST官方模型中的测试调用。该文件包含以下行,没有范围修饰符:
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>
因此,main
在函数外部或内部调用时,符号会更改定义g_main
,并且运行时范围也不同。这是如何运作的?
周围有两个不同的 main
s(嗯,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.main
。unittest_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。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句