第36章-创建模块和包

创建python模块是大多数python程序员每天都在做的事情,他们甚至没有考虑过。每次保存新的python脚本时,都会创建一个新模块。您可以将模块导入其他模块。包是相关模块的集合。从标准库导入到脚本中的内容是模块或包。在本章中,我们将学习如何创建模块和包。我们将在包上花费更多的时间,因为它们比模块更复杂。

如何创建python模块

我们将从创建一个超级简单的模块开始。该模块将为我们提供基本的算法和无错误处理。下面是我们的第一个示例:

def add(x, y):
    return x + y

def division(x, y):
    return x / y

def multiply(x, y):
    return x * y

def subtract(x, y):
    return x - y

当然,这个代码有问题。如果将两个整数传递给 分开 方法,如果您使用的是python 2.x,那么您将得到一个整数。这可能不是您所期望的。也没有错误检查零除或字符串和数字的混合。但这不是重点。要点是,如果保存此代码,您将拥有一个完全合格的模块。我们称之为 arithmetic.py .现在你能用模块做什么呢?您可以导入它并使用它内部定义的任何函数或类。我们可以做到 可执行文件 用一点口水和上光剂。我们两个都做!

首先,我们将编写一个小脚本,导入我们的模块并运行其中的函数。将以下内容另存为 math_test.py

import arithmetic

print(arithmetic.add(5, 8))
print(arithmetic.subtract(10, 5))
print(arithmetic.division(2, 7))
print(arithmetic.multiply(12, 6))

现在让我们修改原始脚本,以便从命令行运行它。以下是最简单的方法之一:

def add(x, y):
    return x + y

def division(x, y):
    return x / y

def multiply(x, y):
    return x * y

def subtract(x, y):
    return x - y

if __name__ == "__main__":
    import sys
    print(sys.argv)
    v = sys.argv[1].lower()
    valOne = int(sys.argv[2])
    valTwo = int(sys.argv[3])
    if v == "a":
        print(add(valOne, valTwo))
    elif v == "d":
        print(division(valOne, valTwo))
    elif v == "m":
        print(multiply(valOne, valTwo))
    elif v == "s":
        print(subtract(valOne, valTwo))
    else:
        pass

执行这个脚本的正确方法是使用python的 optparse (pre-2.7)argparse(2.7+) 模块。你应该花一些时间来找出这些模块中的一个作为学习练习。在此期间,我们将继续使用软件包!

如何创建python包

模块和包之间的主要区别在于,包是模块的集合,它具有 __init__. Py **文件。根据包的复杂性,它可能有多个 _初始版本**。让我们来看一个简单的文件夹结构,使其更加明显,然后我们将创建一些简单的代码来遵循我们定义的结构。

mymath/
    __init__.py
    adv/
        __init__.py
        sqrt.py
    add.py
    subtract.py
    multiply.py
    divide.py

现在我们只需要在自己的包中复制这个结构。让我们试一试吧!像上面的例子一样,在文件夹树中创建每个文件。对于加法、减法、乘法和除法文件,可以使用我们在前面的示例中创建的函数。对于 sqrt.py 模块,我们将使用以下代码。

# sqrt.py
import math

def squareroot(n):
    return math.sqrt(n)

你可以两个都离开 __init__. Py **文件是空白的,但是你必须像这样写代码 mymath.add.add(x,y)添加 很难看,所以我们将在外部添加以下代码 _ init_uuu.py**使使用我们的软件包更容易理解和使用。

# outer __init__.py
from . add import add
from . divide import division
from . multiply import multiply
from . subtract import subtract
from .adv.sqrt import squareroot

现在,一旦我们的模块位于python路径上,我们就可以使用它了。您可以将文件夹复制到您的python site-packages 要执行此操作的文件夹。在Windows上,它位于以下常规位置: C:\Python34\Lib\site-packages .或者,您可以在测试代码中动态地编辑路径。让我们看看是怎么做到的:

import sys

# modify this path to match your environment
sys.path.append('C:\Users\mdriscoll\Documents')

import mymath

print(mymath.add(4,5))
print(mymath.division(4, 2))
print(mymath.multiply(10, 5))
print(mymath.squareroot(48))

请注意,我的路径不包括 我的数学 文件夹。您希望附加保存新模块的父文件夹,而不是模块文件夹本身。如果您这样做,那么上面的代码应该可以工作。

您还可以创建 setup.py 编写脚本并将包安装到 发展 模式。下面是一个示例setup.py脚本:

#!/usr/bin/env python

from setuptools import setup


# This setup is suitable for "python setup.py develop".

setup(name='mymath',
      version='0.1',
      description='A silly math package',
      author='Mike Driscoll',
      author_email='mike@mymath.org',
      url='http://www.mymath.org/',
      packages=['mymath', 'mymath.adv'],
      )

将此脚本保存在 我的数学 文件夹。要以开发模式安装软件包,请执行以下操作:

python setup.py develop

这将在“站点包”文件夹中安装一个链接文件,指向包所在的位置。这对于在没有实际安装包的情况下进行测试非常有用。

祝贺你!您刚刚创建了一个python包!

总结

您刚刚学习了如何创建自己的定制模块和包。您会发现,代码越多,创建程序的频率就越高,这些程序中有您想要重用的部分。您可以将这些可重用的代码片段放入模块中。最终,您将拥有足够的相关模块,可以将它们转换成一个包。现在你有了真正做到这一点的工具!