第 23 章 模块编码基础 模块编码基础
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
现在,我们已经了解了模块背后的大概念,让我们来看一些模块的实际例子。虽然本章的一些早期主题对于已经在前面章节的示例中应用过它们的线性读者来说是复习,但我们会发现它们很快就会把我们引向围绕 Python 模块的更多我们还没有遇到过的细节,如嵌套、重载、作用域等。
Python 模块很容易创建;它们只是用文本编辑器创建的 Python 程序代码文件。您不需要编写特殊的语法来告诉 Python 您正在创建一个模块;几乎任何文本文件都可以。因为 Python 会处理查找和加载模块的所有细节,所以模块也很容易使用;客户端只需导入模块或模块定义的特定名称,并使用它们引用的对象。
模块创建
要定义一个模块,,只需使用文本编辑器在文本文件中键入一些 Python 代码,并以".py "扩展名保存即可;任何这样的文件都会被自动视为一个 Python 模块。模块顶层指定的所有名称都会成为模块的属性(与模块对象相关的名称),并输出给客户端使用--它们会自动从变量变为模块对象属性。
例如,如果在名为module1.py的文件中键入以下def 并导入,就会创建一个模块对象,该对象只有一个属性--名称printer ,而这个名称恰好是对函数对象的引用:
def printer(x): # Module attribute
print(x)模块文件名
在我们继续之前,我应该再说几句关于模块文件名的话。你可以随心所欲地调用模块,但如果你打算导入模块,模块文件名应该以.py后缀结尾。对于将被运行但不会被导入的顶层文件,.py在技术上是可有可无的,但在任何情况下添加它都会使文件类型更加明显,并允许你在将来导入任何文件。
因为模块名会成为 Python 程序中的变量名 (不带.py),所以它们也应该遵循第 11 章中列出的普通变量名规则。例如,您可以创建一个名为if.py 的模块文件,但您不能导入它,因为if 是一个保留字--当您尝试运行import if 时,您会得到一个语法错误。事实上,模块文件名和包导入中使用的目录名(将在下一章讨论)都必须符合第 11 章中介绍的变量名规则;例如,它们只能包含字母、数字和下划线。软件包目录的名称也不能包含特定平台的语法,例如空格。
导入模块时,Python 会将内部模块名映射到外部文件名,方法是在前面加上模块搜索路径中的目录路径,并在后面加上.py或其它扩展名。例如,一个名为M 的模块最终会映射到某个包含模块代码的外部文件<directory>\M.<extension>中。
其他类型的模块
如前一章所述,也可以通过用 C、C++ 等外部语言(如 Java 的 Jython 语言实现)编写代码来创建 Python 模块。当被 Python 代码导入时,扩展模块的外观和感觉与作为 Python 源代码文件编码的模块相同--它们通过import 语句访问,并提供函数和对象作为模块属性。扩展模块超出了本书的讨论范围;更多详情请参见 Python 标准手册或高级教材,如《Python 编程》,。
模块使用
客户端可以通过运行import 或from 语句,使用我们刚刚编写的简单模块文件。如果模块文件尚未加载,这两种语句都能查找、编译和运行模块文件的代码。两者的主要区别在于import 获取的是整个模块,因此必须有获取模块名称的资格;相比之下,from 从模块中获取(或复制)特定名称。
让我们看看这在代码中意味着什么。以下所有示例都会调用上一节的 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access