打开终端, cd至my_package包地址的文件夹,但不要进入my_package。在这个文件夹下运行Python表明器。我行使的是IPython,由于它的自动补全成果很是利便:
- In [1]: import my_package
- In [2]: my_package.subpackage1.module_x
- Out[2]: <module 'my_package.subpackage1.module_x' from 'my_package/subpackage1/module_x.py'>
- In [3]: my_package.subpackage1.module_x.main
- spam spam spam
相对导入合用于你最终要放入包中的代码。假如你编写了许多相干性强的代码,那么应该回收这种导入方法。你会发明PyPI上有许多风行的包也是回收了相对导入。还要留意一点,假如你想要超过多个文件层级举办导入,只必要行使多个句点即可。不外,PEP 328提议相对导入的层级不要高出两层。
还要留意一点,假如你往 module_x.py文件中添加了if__name__==‘__main__’,然后试图运行这个文件,你会遇到一个很难领略的错误。编辑一下文件,试试看吧!
- from . module_y import spam as ham
- def main:
- ham
- if __name__ == '__main__':
- # This won't work!
- main
此刻从终端进入 subpackage1文件夹,执行以下呼吁:
- python module_x.py
假如你行使的是Python 2,你应该会看到下面的错误信息:
- Traceback (most recent call last):
- File "module_x.py", line 1, in <module>
- from . module_y import spam as ham
- ValueError: Attempted relative import in non-package
假如你行使的是Python 3,错误信息或许是这样的:
- Traceback (most recent call last):
- File "module_x.py", line 1, in <module>
- from . module_y import spam as ham
- SystemError: Parent module '' not loaded, cannot perform relative import
这指的是, module_x.py是某个包中的一个模块,而你试图以剧本模式执行,可是这种模式不支持相对导入。
假如你想在本身的代码中行使这个模块,那么你必需将其添加至Python的导入检索路径(import search path)。最简朴的做法如下:
- import sys
- sys.path.append('/path/to/folder/containing/my_package')
- import my_package
留意,你必要添加的是 my_package的上一层文件夹路径,而不是my_package自己。缘故起因是my_package就是我们想要行使的包,以是假如你添加它的路径,那么将无法行使这个包。
我们接下来谈谈可选导入。
可选导入(Optional imports)
假如你但愿优先行使某个模块或包,可是同时也想在没有这个模块或包的环境下有备选,你就可以行使可选导入这种方法。这样做可以导入支持某个软件的多种版本可能实现机能晋升。以github2包中的代码为例:
- try:
- # For Python 3
- from http.client import responses
- except ImportError: # For Python 2.5-2.7
- try:
- from httplib import responses # NOQA
- except ImportError: # For Python 2.4
- from BaseHTTPServer import BaseHTTPRequestHandler as _BHRH
- responses = dict([(k, v[0]) for k, v in _BHRH.responses.items])
lxml包也有行使可选导入方法:
- try:
- from urlparse import urljoin
- from urllib2 import urlopen
- except ImportError:
- # Python 3
- from urllib.parse import urljoin
- from urllib.request import urlopen
正如以上示例所示,可选导入的行使很常见,是一个值得把握的能力。
局部导入
当你在局部浸染域中导入模块时,你执行的就是局部导入。假如你在Python剧本文件的顶部导入一个模块,那么你就是在将该模块导入至全局浸染域,这意味着之后的任何函数或要领都也许会见该模块。譬喻:
- import sys # global scope
- def square_root(a):
- # This import is into the square_root functions local scope
- import math
- return math.sqrt(a)
- def my_pow(base_num, power):
- return math.pow(base_num, power)
- if __name__ == '__main__':
- print(square_root(49))
- print(my_pow(2, 3))
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|