在__init__.py中定义任何变量

时间:2015-07-11 06:24:39

标签: python

我有很多帖子使用__init__.py的情况,用于定义全局变量就是其中之一。
但我想知道在__init__.py中定义局部变量是否有任何缺点?

2 个答案:

答案 0 :(得分:2)

没有技术原因阻止使用__init__.py声明全局变量。

然而,__ init__.py模块的意思是定义应用程序的导入结构。从Python文档:

  

需要__init__.py文件才能使Python将目录视为包含包;这样做是为了防止具有通用名称的目录(例如字符串)无意中隐藏稍后在模块搜索路径上发生的有效模块。在最简单的情况下,__ init__.py可以只是一个空文件,但它也可以执行包的初始化代码或设置__all__变量,稍后将对此进行描述。

作为开发人员,我希望在__init__.py文件中找到应用程序本身的导入布局。当我探索源代码时,它是我寻找的最后一个地方。

因此,将您的实现隐藏在__init__.py中会产生误导。对于全局变量尤其如此,根据定义,生命周期难以遵循。

它被认为是一种不好的做法,因为它破坏了代码的可读性,这是Python的指导原则。

import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
...
Readability counts.
...

答案 1 :(得分:1)

使用全局变量一般存在问题:

  • 将变量作为参数传递给函数,例如比具有访问全局变量的函数更灵活和可读。

  • 如果是连接对象的网络,对象通常会更灵活地让成员引用其他对象,然后让他们使用全局变量访问其他对象。

  • 拥有模块导出类而不是实例允许您拥有一个类的多个实例而不是一个。

话虽如此,我的经验是,在编程中没有教条。算法设计中一个众所周知的引理是,从每个资源(程序中的东西)可能有零,一个或无限多个。如果您通常只能拥有一个对象实例并且它不会更改标识,那么从模块中导出实例(因此在模块__init__.py中定义它)就可以了。

只是在设计之初,您有时会假设某个资源是唯一的,但后来证明您将拥有多个资源。

导出变量而不是类型的典型应用是它实际上是常量。一个很好的例子就是math.pi,它不会经常改变......

请注意,由于Python中的所有内容都是对象,因此“变量”和“实例”这两个词在这里可以互换使用。除此之外,函数和类在Python中本身就是(通常是单例)对象。