《Python高手之路(第3版)》——第2章 模块和库 2.1 导入系统

简介:

本节书摘来自异步社区《Python高手之路(第3版)》一书中的第2章,第2.1节,作者[法]Julien Danjou,王飞龙 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

第2章 模块和库

2.1 导入系统

要使用模块和库,需要先导入。

>>> import this  
The Zen of Python, by Tim Peters  

Beautiful is better than ugly.  
Explicit is better than implicit.  
Simple is better than complex.  
Complex is better than complicated.  
Flat is better than nested.  
Sparse is better than dense.  
Readability counts.  
Special cases aren't special enough to break the rules.  
Although practicality beats purity.  
Errors should never pass silently.  
Unless explicitly silenced.  
In the face of ambiguity, refuse the temptation to guess.  
There should be one-- and preferably only one --obvious way to do it.  
Although that way may not be obvious at first unless you're Dutch.  
Now is better than never.  
Although never is often better than *right* now.  
If the implementation is hard to explain, it's a bad idea.  
If the implementation is easy to explain, it may be a good idea.  
Namespaces are one honking great idea -- let's do more of those!

导入系统是相当复杂的,不过你可能已经了解了一些基本知识。这里会介绍一些关于这一子系统的内部机理。

sys模块包含许多关于Python导入系统的信息。首先,当前可导入的模块列表可以通过sys.moudle变量获取。它是一个字典,其中键(key)是模块名字,对应的值(value)是模块对象。

>>> sys.modules['os']  
<module 'os' from '/usr/lib/python2.7/os.pyc'>

许多模块是内置的,这些内置的模块在sys.builtin_module_names中列出。内置的模块可以根据传入Python构建系统的编译选项的不同而变化。

导入模块时,Python会依赖一个路径列表。这个列表存储在sys.path变量中,并且告诉Python去哪里搜索要加载的模块。可以在代码中修改这个列表,根据需要添加或删除路径,也可以通过编写Python代码直接修改环境变量PYTHONPATH。下面的方法几乎是相等的。

>>> import sys  
>>> sys.path.append('/foo/bar')

$ PYTHONPATH=/foo/bar python  
>>> import sys  
>>> '/foo/bar' in sys.path  
True

在sys.path中的顺序很重要,因为需要遍历这个列表来寻找请求的模块。

也可以通过自定义的导入器(importer)对导入机制进行扩展。Hy正是利用这种技术告诉Python如何导入其他非标准的.py或者.pyc文件的。

顾名思义,导入钩子机制是由PEP 302(http://www.python.org/dev/peps/pep-0302/) 定义的。它允许扩展标准的导入机制,并对其进行预处理,也可以通过追加一个工厂类到sys.path_hooks来添加自定义的模块查找器(finder)。

模块查找器对象必须有一个返回加载器对象的find_module(fullname, path=None)方法,这个加载器对象必须包含一个负责从源文件中加载模块的load_module(fullname)方法。

为了进一步说明,下面给出了Hy利用自定义的导入器导入.hy而不是.py结尾的源文件的方法,见示例2.1。

示例2.1 Hy模块导入器

class MetaImporter(object):  
     def find_on_path(self, fullname):  
          fls = ["%s/__init__.hy", "%s.hy"]  
          dirpath = "/".join(fullname.split("."))  

          for pth in sys.path:  
               pth = os.path.abspath(pth)  
               for fp in fls:  
                    composed_path = fp % ("%s/%s" % (pth, dirpath))  
                    if os.path.exists(composed_path):  
                         return composed_path  

     def find_module(self, fullname, path=None):  
          path = self.find_on_path(fullname)  
          if path:  
               return MetaLoader(path)  

sys.meta_path.append(MetaImporter())

一旦路径被确定是有效的且指向了一个模块,就会返回一个MetaLoader对象。

Hy模块加载器

class MetaLoader(object):  
     def __init__(self, path):  
          self.path = path  

     def is_package(self, fullname):  
          dirpath = "/".join(fullname.split("."))  
          for pth in sys.path:  
               pth = os.path.abspath(pth)  
               composed_path = "%s/%s/__init__.hy" % (pth, dirpath)  
               if os.path.exists(composed_path):  
                    return True  
          return False  

     def load_module(self, fullname):  
          if fullname in sys.modules:  
               return sys.modules[fullname]  

          if not self.path:  
               return  

          sys.modules[fullname] = None  
          mod = import_file_to_module(fullname, self.path)  1

          ispkg = self.is_package(fullname)  

          mod.__file__ = self.path  
          mod.__loader__ = self  
          mod.__name__ = fullname  

          if ispkg:  
               mod.__path__ = []  
               mod.__package__ = fullname  
          else:  
               mod.__package__ = fullname.rpartition('.')[0]  

          sys.modules[fullname] = mod  
          return mod

1 import_file_to_module读取一个Hy源文件,将其编译成Python代码,并返回一个Python模块对象。

uprefix模块(https://pypi.python.org/pypi/uprefix) 是这个功能起作用的另一个好的例子。Python 3.0到3.2并没有像Python 2中用来表示Unicode字符串的u前缀,这个模块通过在编译前删除字符串的前缀u来确保在2.x和3.x之间的兼容性。

相关文章
|
3天前
|
算法 Python
请解释Python中的关联规则挖掘以及如何使用Sklearn库实现它。
使用Python的mlxtend库,可以通过Apriori算法进行关联规则挖掘。首先导入TransactionEncoder和apriori等模块,然后准备数据集(如购买行为列表)。对数据集编码并转换后,应用Apriori算法找到频繁项集(设置最小支持度)。最后,生成关联规则并计算置信度(设定最小置信度阈值)。通过调整这些参数可以优化结果。
25 9
|
3天前
|
索引 Python
如何在Python中使用Pandas库进行季节性调整?
在Python中使用Pandas和Statsmodels进行季节性调整的步骤包括:导入pandas和seasonal_decompose模块,准备时间序列DataFrame,调用`seasonal_decompose()`函数分解数据为趋势、季节性和残差,可选地绘制图表分析,以及根据需求去除季节性影响(如将原始数据减去季节性成分)。这是对时间序列数据进行季节性分析的基础流程。
19 2
|
1天前
|
数据挖掘 数据处理 索引
如何使用Python的Pandas库进行数据筛选和过滤?
Pandas是Python数据分析的核心库,提供DataFrame数据结构。基本步骤包括导入库、创建DataFrame及进行数据筛选。示例代码展示了如何通过布尔索引、`query()`和`loc[]`方法筛选`Age`大于19的记录。
5 0
|
2天前
|
数据处理 Python
如何使用Python的Pandas库进行数据排序和排名
【4月更文挑战第22天】Pandas Python库提供数据排序和排名功能。使用`sort_values()`按列进行升序或降序排序,如`df.sort_values(by=&#39;A&#39;, ascending=False)`。`rank()`函数用于计算排名,如`df[&#39;A&#39;].rank(ascending=False)`。多列操作可传入列名列表,如`df.sort_values(by=[&#39;A&#39;, &#39;B&#39;], ascending=[True, False])`和分别对&#39;A&#39;、&#39;B&#39;列排名。
13 2
|
3天前
|
Python
如何使用Python的Pandas库进行数据缺失值处理?
Pandas在Python中提供多种处理缺失值的方法:1) 使用`isnull()`检查;2) `dropna()`删除含缺失值的行或列;3) `fillna()`用常数、前后值填充;4) `interpolate()`进行插值填充。根据需求选择合适的方法处理数据缺失。
29 9
|
4天前
|
数据挖掘 API 数据安全/隐私保护
python请求模块requests如何添加代理ip
python请求模块requests如何添加代理ip
|
4天前
|
缓存 自然语言处理 数据处理
Python自然语言处理面试:NLTK、SpaCy与Hugging Face库详解
【4月更文挑战第16天】本文介绍了Python NLP面试中NLTK、SpaCy和Hugging Face库的常见问题和易错点。通过示例代码展示了如何进行分词、词性标注、命名实体识别、相似度计算、依存关系分析、文本分类及预训练模型调用等任务。重点强调了理解库功能、预处理、模型选择、性能优化和模型解释性的重要性,帮助面试者提升NLP技术展示。
22 5
|
5天前
|
Python
如何使用Python的Plotly库创建交互式图表?
Plotly是Python的交互式图表库,支持多种图表类型,如折线图、散点图、柱状图。使用步骤包括安装库、导入模块、准备数据、创建图表对象、添加数据和设置属性,最后显示或保存图表。
16 6
|
5天前
|
机器学习/深度学习 数据采集 算法
请解释Python中的Sklearn库以及它的主要用途。
Sklearn是Python的机器学习库,提供数据预处理、特征选择、分类回归、聚类、模型评估和参数调优等工具。包含监督和无监督学习算法,如SVM、决策树、K-means等,并提供样例数据集便于实践。它是进行机器学习项目的重要资源。
13 1
|
5天前
|
XML 数据采集 自然语言处理
请解释Python中的BeautifulSoup库以及它的主要用途。
BeautifulSoup是Python的HTML/XML解析库,用于数据提取和网页抓取。它提供树形结构解析文档,支持查找、访问和修改元素。主要用途包括网页抓取、数据清洗、自动化测试、内容生成、网站开发及与其他库集成,如Requests和Scrapy。适用于各种数据处理场景。
9 1