2015-07-11 100 views
1

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

+0

你是指“在__init __。py中定义一个**局部变量**”是什么意思? –

回答

1

使用全局变量有它的问题一般:

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

  • 在连接对象网络的情况下,对于让对象引用其他对象,然后使用全局对象访问其他对象,通常会更灵活。

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

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

这只是在设计开始时,您有时会认为某个资源是独一无二的,但后来发现您会拥有多个资源。

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

请注意,由于在Python中一切都是对象,所以在这里可以互换使用“变量”和“实例”。除此之外,函数和类在Python中都是(通常是单例)对象。

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. 
...