【全栈之路】10 天掌握 Python 开发(8)依赖管理和类型注解

189 阅读6分钟

pip

在 Python 中,默认使用 pip 管理第三方包,与 JavaScript 项目中的 npm 类似。

软件包安装

在安装 Python 环境时,pip 工具也会自动安装到操作系统中。你可以使用 pip install 命令安装需要的第三方包。

pip install package_name1 package_name2

它与 JavaScript 项目中的 npm install package1 package2 相似。

:::tip 软件仓库 Python 的官方软件仓库为 pypi.org :::

软件包卸载

pip uninstall package_name

与 JavaScript 项目中的 npm uninstall package1 package2 相似。

:::tip Python 默认采用集中式依赖管理策略,会将安装的第三方包统一存放在 Python 解释器目录而不是当前项目的目录中,因此包的安装与卸载并不会在项目目录中留下任何蛛丝马迹。

通过 pip install 安装的第三方包,相当于直接安装到了全局,与 JavaScript 项目默认将第三方包存储到 node_modules 目录中有很大不同。 :::

列出项目依赖

JavaScript 使用 package.json 中的 dependenciesdevDependencies 列出项目中依赖的第三方包名称以及版本号。在 Python 中,这一过程不会自动发生,我们需要使用 pip freeze > requirements.txt 命令将项目依赖项持久化到一个叫做 requirements.txt 的文件中,其他人通过 pip install -r requirements.txt 即可自动安装项目全部依赖。

:::tip requirements.txt 内容太多了? 我们常常发现 requirements.txt 中会出现许多项目中没有直接用到的第三方包,这是因为它列出了当前 Python 解释器下所有已安装的第三方包,这是因为系统中只有一个 Python 环境,如果我们想要看到更清晰的项目依赖列表,就需要通过虚拟环境来进行隔离。 :::

相关资源


venv 和 conda

在 Python 中,虚拟环境是一种工具,它可以为每个项目创建单独的 Python 环境,实现项目依赖的隔离。虚拟环境允许开发人员为不同的项目安装不同版本的包,而不会相互干扰。这在同时处理具有不同要求的多个项目时尤其有用,与 JavaScript 工程师常使用的 nvm 工具类似。

虚拟环境的工作原理

虚拟环境的三个重要组成部分是:创建虚拟环境、激活虚拟环境和安装依赖包。

虚拟环境是一个文件目录,目录中包含了特定版本的 Python 可执行文件以及相关依赖。通过激活命令,将终端中的 Python 以及相关的命令指向该虚拟环境目录,从而实现项目之间依赖的隔离。

venv 管理虚拟环境

venv 是 Python 默认的虚拟环境管理工具。

创建虚拟环境

在项目根目录中,使用 python -m venv myvenv 创建一个虚拟环境,此时会自动新建一个 myvenv 的目录,该目录即为虚拟环境目录,里面包含了 Python 可执行文件,虚拟环境所创建的 Python 版本与当前使用的 Python 解释器版本一致。

激活虚拟环境

使用命令 source ./myvenv/bin/activate 激活虚拟环境。

退出虚拟环境

虚拟环境只在当前终端内有效,关闭终端之后虚拟环境自动取消激活

:::tip 你可以随时通过 shell 命令 where python 查看当前终端中正在使用的 Python 可执行文件的路径以确定是否位于正确的虚拟环境中。 :::

conda 管理虚拟环境

conda 是一个虚拟环境管理工具,使用 conda 之前,需要按照 官方文档 步骤安装 conda 。

创建虚拟环境

conda create --prefix ./myvenv python=3.8

上面的命令指定了虚拟环境需要使用的特定 Python 版本,当一些项目需要工作在指定 Python 版本下时,这会非常有用。

激活虚拟环境

conda activate ./myvenv 

退出虚拟环境

conda deactivate

:::tip 安装第三方包 当虚拟环境激活时,使用 pip install package_name 安装第三方包,这些包文件将存储到 虚拟环境名称/lib/python版本/site-packages 文件夹中,如此,项目之间的依赖便通过虚拟环境进行了隔离。 :::

相关资源


poetry

poetry 是 Python 中一个非常强大的工具,可以将项目的依赖管理简化到极致。

安装 poetry

开始使用 poetry 之前,你需要根据 官方文档 的指引将 poetry 安装到操作系统中。

创建新项目

安装了 poetry 之后,可以使用以下命令创建一个由 poetry 管理依赖的新项目:

poetry new myproject

项目创建完成后,会在根目录中创建一个 pyproject.toml 文件,它的作用与 JavaScript 项目中的 package.json 一样。

它的内容如下:

[tool.poetry]
name = "myproject"
version = "0.1.0"
description = ""
authors = ["luckrnx09 <luckrnx09@gmail.com>"]
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.11"


[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

其中的 Python 版本会默认使用当前 Python 解释器的版本,如需要使用指定的 Python 版本,可以直接修改 pyproject.toml 文件,然后创建并激活该 Python 版本的虚拟环境。

管理第三方包

使用 poetry 管理的项目,不需要使用 pip 管理第三方包。

安装第三方包的命令如下:

poetry add package_name

卸载包的命令也类似:

poetry remove package_name

所有的安装/卸载操作的结果,都将自动反映到 pyproject.toml 文件中,因此,你无需再使用 pip freeze 手动列出依赖项。

在一个包含 pyproject.toml 文件的 Python 项目中,只需要通过 poetry install 命令即可自动安装项目的所有依赖。

运行 Python 脚本

使用了 poetry 的项目,需要通过如下命令运行 Python 脚本以正确解析依赖:

poetry run python your_script.py

相关资源


类型注解

编写 Python 代码时,通常会遇到需要明确变量类型的情况。Python 3.5 引入了类型注解,并在后续版本中得到了增强和改进。类型注解不会影响运行时结果,与 TypeScript 十分相似。

使用类型注解

类型注解在 Python 中不是必须的,类型注解是一种在 Python 中指定变量类型的方法,它可以提供更好的代码可读性、可维护性。

变量

age: int = 25
name: str = "John"

函数参数和返回值

def add(x: int, y: int) -> int:
    return x + y

可选参数和默认值

from typing import Union
def greet(name: str, age: Union[int, None] = None) -> str:
    if age is None:
        return f"Hello, {name}!"
    else:
        return f"Hello, {name}! You are {age} years old."

class Person:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

    def greet(self) -> str:
        return f"Hello, my name is {self.name} and I am {self.age} years old."

类型别名

from typing import List, Tuple

Coordinates = Tuple[float, float]
PointList = List[Coordinates]

def get_distance(point1: Coordinates, point2: Coordinates) -> float:
    x1, y1 = point1
    x2, y2 = point2
    return ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5

def process_points(points: PointList) -> List[float]:
    distances = []
    for i in range(len(points) - 1):
        distance = get_distance(points[i], points[i+1])
        distances.append(distance)
    return distances

编译时类型检查

在 Python 中的 mypy 一个类似于 TypeScript 的 tsc命令行工具,使用它可以对代码的类型进行检查。

pip install mypy
mypy my_script.py

相关资源


本书的内容完全免费,开源地址:github.com/luckrnx09/p…