python模块导入__name__
2010-11-24 15:57
309 查看
主程序代码通常都和你前面看到的代码相似,检查 __name__ 变量的值然后再执行相应的调用(参阅下一页的核心笔记)。主程序中的代码通常包括变量赋值, 类定义和函数定义,随后检查__name__来决定是否调用另一个函数(通常调用main()函数)来完成该模块的功能。主程序通常都是做这些事。(我们上面的例子中使用test()而不是main()是为了避免你在读到核心笔记前感到迷惑。) 不管用什么名字,我们想强调一点那就是:这儿是放置测试代码的好地方。我们在3.4.2 小节中曾经说过,大部分的Python 模块都是用于导入调用的,直接运行模块应该调用该模块的回归测试代码。
由于主程序代码无论模块是被导入还是被直接执行都会运行, 我们必须知道模块如何决定运行方向。一个应用程序可能需要导入另一个应用程序的一个模块,以便重用一些有用的代码(否则就只能用拷贝粘贴那种非面向对象的愚蠢手段)。这种情况下,你只想访问那些位于其它应用程序中的代码,而不是想运行那个应用程序。因此一个问题出现了,“Python 是否有一种方法能在运行时检测该模块是被导入还是被直接执行呢?” 答案就是......(鼓声雷动).....没错! __name__ 系统变量就是正确答案。
如果模块是被导入, __name__ 的值为模块名字
如果模块是被直接执行, __name__ 的值为 '__main__'
所有的 Python
模块都是对象并且有几个有用的属性。 您可以使用这些属性方便地测试您所书写的模块。 下面是一个使用 if
__name__
的技巧。
if __name__ == "main":
在继续学习新东西之前, 有几点重要的观察结果。 首先, if
表达式无需使用圆括号括起来。 其次, if
语句以冒号结束, 随后跟随的是缩进代码。
与 C
一样, Python
使用 ==
做比较, 使用 =
做赋值。 与 C
不一样, Python
不支持行内赋值, 所以不会出现想要进行比较却意外地出现赋值的情况。
那么为什么说这个特殊的 if
语句是一个技巧呢?模块是对象, 并且所有的模块都有一个内置属性 __name__
。一个模块的 __name__
的值要看您如何应用模块。如果 import
模块, 那么 __name__
的值通常为模块的文件名, 不带路径或者文件扩展名。但是您也可以像一个标准的程序一样直接运行模块, 在这种情况下 __name__
的值将是一个特别的缺省值, __main__
。
一旦了解到这一点, 您可以在模块内部为您的模块设计一个测试套件, 在其中加入这个 if
语句。当您直接运行模块, __name__
的值是 __main__
, 所以测试套件执行。当您导入模块, __name__
的值就是别的东西了, 所以测试套件被忽略。这样使得在将新的模块集成到一个大程序之前开发和调试容易多了。
由于主程序代码无论模块是被导入还是被直接执行都会运行, 我们必须知道模块如何决定运行方向。一个应用程序可能需要导入另一个应用程序的一个模块,以便重用一些有用的代码(否则就只能用拷贝粘贴那种非面向对象的愚蠢手段)。这种情况下,你只想访问那些位于其它应用程序中的代码,而不是想运行那个应用程序。因此一个问题出现了,“Python 是否有一种方法能在运行时检测该模块是被导入还是被直接执行呢?” 答案就是......(鼓声雷动).....没错! __name__ 系统变量就是正确答案。
如果模块是被导入, __name__ 的值为模块名字
如果模块是被直接执行, __name__ 的值为 '__main__'
所有的 Python
模块都是对象并且有几个有用的属性。 您可以使用这些属性方便地测试您所书写的模块。 下面是一个使用 if
__name__
的技巧。
if __name__ == "main":
在继续学习新东西之前, 有几点重要的观察结果。 首先, if
表达式无需使用圆括号括起来。 其次, if
语句以冒号结束, 随后跟随的是缩进代码。
与 C
一样, Python
使用 ==
做比较, 使用 =
做赋值。 与 C
不一样, Python
不支持行内赋值, 所以不会出现想要进行比较却意外地出现赋值的情况。
那么为什么说这个特殊的 if
语句是一个技巧呢?模块是对象, 并且所有的模块都有一个内置属性 __name__
。一个模块的 __name__
的值要看您如何应用模块。如果 import
模块, 那么 __name__
的值通常为模块的文件名, 不带路径或者文件扩展名。但是您也可以像一个标准的程序一样直接运行模块, 在这种情况下 __name__
的值将是一个特别的缺省值, __main__
。
>>> import odbchelper >>> odbchelper.__name__ 'odbchelper'
一旦了解到这一点, 您可以在模块内部为您的模块设计一个测试套件, 在其中加入这个 if
语句。当您直接运行模块, __name__
的值是 __main__
, 所以测试套件执行。当您导入模块, __name__
的值就是别的东西了, 所以测试套件被忽略。这样使得在将新的模块集成到一个大程序之前开发和调试容易多了。
相关文章推荐
- python模块导入问题和if __name__ == '__main__'语句的使用
- Python模块Scrapy导入出错:ImportError: cannot import name xmlrpc_client
- python模块与包的了解,__name__的功能,包中函数的导入
- python导入自定义模块
- python有三种导入模块的方法(转)
- python之导入模块
- python导入sklearn模块出现DLL load failed的解决办法
- Python脚本中导入自身模块
- python中模块导入
- ubuntu环境下安装python3,配置文件正常导入自定义模块
- Python中模块导入之版本二与三的区别
- python导入词云包失败:ImportError:cannot import name ‘WordCloud’的解决办法
- Python中两种模块导入方法
- Python从模块导入函数
- python安装第三方包之后无法导入相应模块(一个容易忽略的bug)
- Python编程时候,导入模块失败
- 从零学python系列之新版本导入httplib模块报ImportError解决方案
- python模块以及导入出现ImportError: No module named 'xxx'问题
- Python 模块导入路径问题
- Python 模块导入路径问题