函数内部或外部的运行时作用域和“ main”符号不同

米格列莫林

我正在阅读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 = maing_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,并且运行时范围也不同。这是如何运作的?

马特·梅瑟史密斯

周围有两个不同的 mains(嗯,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此外,它们不会使用所有内容污染当前的名称空间unittestimport *出于多种原因,您不想这样做,这就是其中之一)。他们违反了自己的样式指南和PEP8 ...并使此方法比必须的更加混乱。

疯狂的猜测:from unittest import *当tensorflow只是一个婴儿时,有人懒惰地做,只是没有意识到后果,并且从那里滚雪球。

HTH。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

列表理解:在调试模式下和正常运行时在作用域方面的不同行为

为什么 `constexpr` 函数在编译和运行时会产生不同的结果?

在ifelse()语句内部和外部运行一行时的输出不同

“运行”和“构建”的运行时间不同

函数内部和外部的输出不同

程序的内存布局中的“内核堆栈”,“ C运行时启动函数的框架”和“ main()的框架”在哪里?

不同的运行时版本和新的.NET CLI

春季-从JUnit和Maven运行时的测试结果不同

单元测试和运行时的不同代码行为

在cron下运行时,mount和umount的行为不同

如何修复“函数_main中引用的未解析的外部符号_gladLoadGLLoader”和“未解析的外部符号_glad_glViewport”?

在运行时动态加载库时出现“未解析的外部符号”错误

在Go中运行时访问符号

从运行时间开始的渐进符号

C ++不同运行时的不同输出

在main()外部访问二维数组会导致运行时分段错误?

不同的数据类型-有符号和无符号

在JavaScript函数运行时将光标更改为等待符号

从文件运行与从bash运行时,awk $ 0和$ 1的行为不同

从终端运行和从Python运行时,脚本的工作方式不同

Android 依赖在编译和运行时有不同的版本:运行 FCM 依赖

通用符号<?>和<?延伸对象>表现不同

字符串和符号的行为不同?

方法.children()length在函数内部和外部的行为不同

从div的内部和外部调用不同的函数

在对象内部和外部调用函数的不同行为

为什么 foo 函数内部和外部的参数值不同

在非启动时运行时main()函数的规则与启动时相同吗?

函数 _main_getcmdline 中引用的未解析外部符号 _SDL_main