codecamp

Python 包导入规范 | Google 官方最佳实践

Tip

使用每个模块的完整路径名来导入模块。

优点:

避免模块名冲突,或是因模块搜索路径与作者的想法不符而导入错误的包。
也更容易找到模块。

缺点:

部署代码更难,因为你必须完整复刻包的层次。
在现代的部署模式下不再是问题。

结论:

所有新的代码都应该用完整包名来导入每个模块。 应该像下面这样导入:

正确

## 在代码中引用完整名称 absl.flags (详细版).
import absl.flags
from doctor.who import jodie


_FOO = absl.flags.DEFINE_string(...)

## 在代码中仅引用模块名 flags (常见情况).
from absl import flags
from doctor.who import jodie


_FOO = flags.DEFINE_string(...)

错误: (假设当前文件和 jodie.py 都在目录 doctor/who/ 下)

## 没有清晰地表达作者想要导入的模块和最终导入的模块.
## 实际导入的模块取决于由外部环境控制的 sys.path.
## 那些名为 jodie 的模块中, 哪个才是作者想导入的?
import jodie

不能臆测 sys.path 包含主程序所在的目录,即使这种环境的确存在。
因此,代码必须认定 import jodie 表示的是名为 jodie 的第三方库或者顶层的包,而非当前目录的 jodie.py

Python 导入规范 | Google 官方 import 规则详解
Python 异常处理规范 | Google 官方最佳实践
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }