Explication détaillée des bases de Python sur les packages et les modules

PHP中文网
Libérer: 2017-06-20 16:49:31
original
1894 Les gens l'ont consulté

Bases de Python - Packages et modules

Écrit devant

Sauf indication contraire, ce qui suit est basé sur Python3

Résumé

  1. Afin de réutiliser et de mieux maintenir le code, Python utilise des modules et des packages ; un Python fichier est un module, et un package est un répertoire spécial qui organise les modules (y compris __init__.pyfichier).

  2. Chemin de recherche du module, PythonL'interpréteur recherche les modules dans un répertoire spécifique, et lors de l'exécution, sys.path est le chemin de recherche.

  3. Utilisez le mot-clé import pour importer le module, faites attention à la relation entre import * et __all__.

1. Modules et importations

Un module est un fichier contenant des définitions et des instructions Python

PythonUn module est Un fichier contenant des définitions et des instructions. Le nom du fichier est le nom du module plus le suffixe .py.

1.1 Né pour la réutilisation

Supposons qu'il existe une fonction ou une classe qui remplit une fonction spécifique et qui est facile à utiliser. Pour utiliser cette fonctionnalité, vous devez copier ce code dans chaque fichier que vous devez utiliser. Le code en double est un tabou en programmation. Si l'implémentation de la fonction doit être modifiée, chaque occurrence devra être modifiée. C'est anti-humain.

La réutilisation peut très bien résoudre ce problème. En fait, les structures telles que les fonctions et les classes facilitent également la réutilisation dans une certaine mesure.

Python organise une série de fonctions, classes, etc. liées dans un fichier, et chaque fichier est un module Python.

1.2 Importer le module

Utilisez le mot-clé import pour importer le module (le module doit être dans le chemin de recherche) :

  1. importer sys ; instruction d’importation de base.

  2. importer sys en tant que système ; alias le nom importé.

  3. à partir du chemin d'importation système ; Importer des éléments spécifiques au module.

  4. from sys import *; importer tous les noms importables depuis sys

import-only-once
module Le comportement importer une seule fois constitue une optimisation substantielle dans la plupart des cas. Dans le même cycle de vie de l'interpréteur, si vous utilisez l'instruction import plusieurs fois pour importer le même module, l'importation n'aura lieu qu'une seule fois.

Cela peut être prouvé en ajoutant des instructions de sortie au module. Utiliser

import * et __all__
utiliser import * peut polluer l'espace de noms du module actuel et importer certains noms qui n'ont pas besoin d'être cités. Son utilisation n’est donc pas recommandée.

En fait, un module tiers standardisé fournira une interface publique de module, exposant les interfaces disponibles pour le module. Les interfaces publiques sont définies par une liste de noms de modules __all__.

Par exemple, si vous définissez un module nommé mtest1 :

__all__ = ['test1', 'test12']def test1():print('test1')def test11():print('test11')def test12():print('test12')
Copier après la connexion

Utilisez toutes les méthodes d'importation :

>>> form mtest1 import *>>> dir()>>> ['__annotations__', '__builtins__', '__doc__', '__loader__','__name__', '__package__', '__spec__', 'test1', 'test12']
Copier après la connexion

Vous pouvez voir que la fonction test11() n'a pas été importée. C'est le rôle de __all__.

2. Les packages et leur construction

Afin de mieux organiser les modules, les modules sont regroupés en packages.

2.1 Le package est un module spécial

Du point de vue du système de fichiers, le package est le répertoire où se trouve le module. Pour que l'interpréteur Python le traite comme un package, le package doit contenir directement un fichier (module) nommé __init__.py.

Un package est fondamentalement un autre type de module, sauf qu'il peut contenir d'autres modules et packages. En tant que module, le contenu d'un package est en fait le contenu du fichier __init__.py (module).

Par exemple, pour un colis nommé constants, le fichier constants/__init__.py est le suivant :

PI = 3.14
Copier après la connexion

Ensuite le colis constants peut être traité comme module ordinaire :

import constantsprint(constants.PI)
Copier après la connexion
2.2 Building Package

Si vous souhaitez construire un package nommé drawing, qui contient le shapes et colors modules, vous devez créer le répertoire et le fichier :

文件/目录描述
~/python加入到搜索路径中的目录
~/python/drawing包目录(drawing包)
~/python/drawing/__init__.py包代码(drawing模块)
~/python/drawing/colors.pycolor模块
~/python/drawing/shapes.pyshapes模块

假设已经将~/python作为搜索目录。依照这个设置,下列导入语句都是合法的:

  1. import drawing # 导入drawing包(即__init__.py模块)

  2. import drawing.colors # 导入colors模块,使用drawing.colors.attr的方式引用

  3. from drawing import shapes # 导入shapes模块

__all__变量
与模块的__all__变量相似,包的__all__变量决定了使用from package import *导入的子模块。

如以上drawing包的__init__.py文件内容如下:

__all__ = ['colors']
Copier après la connexion

那么使用from drawing import *只会导入colors模块。

3. 搜索路径

现在已经编写完了一个很好用的模块,并且通过了测试。那么如何让这个模块可用呢?即如何让这个模块具备可导入到其他模块的能力。

3.1 搜索模块

当使用import语句导入模块时,Python解释器通过以下方式搜索模块:

  1. 首先搜索built-in模块

  2. 最后搜索变量sys.path提供的路径列表

sys.path在解释器启动时从以下位置初始化:

  1. 当前脚本路径

  2. 环境变量PYTHONPATH指定的路径集合

  3. 安装默认路径

sys.path初始化完成后,可以在运行时修改。

3.2 让模块可用

那么现在若要使模块可用,一是将其放置到已有的搜索路径下,二是指定模块所在路径为搜索路径。

一般情况下,若选择第一种方式,我们将模块放置到Python安装路径的\lib\site-packages下,这个目录是专门用来安装第三方模块的。正如该目录下的README文件展示的那样:

This directory exists so that 3rd party packages can be installed here. Read the source for site.py for more details.

若选择第二种方式,直接将模块所在目录加入到环境变量PYTHONPATH中即可。

值得注意的是,可以在\lib\site-packages路径下新建一个名为user_lib.pth的文件,内容是需要搜索的路径,一行一个,也可以将指定路径加入到搜索目录中:

Explication détaillée des bases de Python sur les packages et les modules

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal