包名和模块名
-
一个包里有三个模块,mod1.py , mod2.py , mod3.py ,但使用 from demopack import * 导入模块时,如何保证只有 mod1 、 mod3 被导入了?
在demopack中的__init__中添加语句all=['mod1','mod3']
-
PEP8中模块注意
-
导入
导入通常是单独一行,例如:
风格良好:
风格不良:
这样也是可以的:
导入常常位于文件顶部,在模块注释和字符串文档之后,在模块的全局变量和常量之前。
导入应该按照以下顺序分组:
-
标准库导入
-
相关的第三方导入
-
特定的本地应用/库导入
在每个导入组之间放一行空行。
把任何相关__all__规范放在导入之后。
推荐绝对导入,因为它们更易读,并且如果导入系统配置的不正确(例如当包中的一个目录结束于sys.path)它们有更好的表现(至少给出更好的错误信息):
import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example
明确的相对导入可以用来接受替代绝对导入,特别是处理复杂包布局时,绝对导入过于冗长。
from . import sibling
from .sibling import example
标准库代码应该避免复杂包布局并使用绝对导入。
隐式的相对导入应该永远不被使用,并且在Python3中已经移除。
从一个包含类的模块中导入类时,通常下面这样是好的写法:
from myclass import MyClass
from foo.bar.yourclass import YourClass
如果这种写法导致本地名字冲突,那么就这样写:
import myclass
import foo.bar.yourclass
避免使用通配符导入(from import *),因为它们使哪些名字出现在命名空间变得不清楚,这混淆了读者和许多自动化工具。通配符导入有一种合理的使用情况,重新发布一个内部接口作为一个公共API的一部分(例如,重写一个纯Python实现的接口,该接口定义从一个可选的加速器模块并且哪些定义将被重写提前并不知道)。
用这种方式重新命名,下面的有关公共和内部接口的指南仍适用。
模块级别的内置属性
模块级别的内置属性(名字有前后双下划线的),例如__all__, author, version,应该放置在模块的文档字符串后,任意import语句之前,from __future__导入除外。Python强制要求from __future__导入必须在任何代码之前,只能在模块级文档字符串之后。
from __future__ import barry_as_FLUFL
__all__ = ['a', 'b', 'c']
__version__ = '0.1'
__author__ = 'Cardinal Biggles'
import os
import sys
```
模块名应该短,所有的字母小写。可以在模块名中使用下划线来提高可读性。Python包名也应该短,所有的字母小写,不鼓励使用下划线。
当一个C或C++书写的扩展模块,伴随Python模块来提供了一个更高层次(例如更面向对象)的接口时,C/C++模块名有一个前导下划线(如_socket)。