Lernen Sie den Importmechanismus des Python-Moduls und die Spezifikationen großer Projekte kennen

coldplay.xixi
Freigeben: 2020-09-27 17:38:16
nach vorne
2808 Leute haben es durchsucht

In der heutigen Spalte „Python-Video-Tutorial“ lernen Sie den Importmechanismus des Python-Moduls und die Spezifikationen großer Projekte kennen.

VorwortLernen Sie den Importmechanismus des Python-Moduls und die Spezifikationen großer Projekte kennen

Bei der Verwendung von Python in unseren täglichen Projekten müssen wir häufig das Importproblem jedes Moduls lösen und stoßen häufig auf Probleme wie das Finden des Referenzpfads, den Cross-Import von Modulen usw. Deshalb habe ich diesen Artikel geschrieben. Ziel dieses Artikels ist es, den Modulimportmechanismus von Python und die Modulimportspezifikationen zu beschreiben, die wir in täglichen Großprojekten befolgen sollten Kapselt den Code in Module, die bei Bedarf direkt importiert und wiederverwendet werden können, um unsere Entwicklungseffizienz zu verbessern. Module können Funktionen, Klassen und Variablen definieren und auch ausführbaren Code enthalten. Es gibt drei Arten von Modulquellen: ①In Python integrierte Module (Standardbibliothek); ②Module von Drittanbietern; ③Benutzerdefinierte Module;

Importprinzip

Der Import von Modulen erfolgt im Allgemeinen durch die Verwendung des Schlüsselworts

import

im Dateiheader. Das Importieren eines Moduls entspricht der einmaligen Ausführung des importierten Moduls und der anschließenden Erstellung eines Moduls in diesem Namensraum Die Verbindung des Modulnamensraums entspricht dem Erstellen einer neuen Variablen in diesem Namensraum. Der Name dieser Variablen ist der Name des importierten Moduls und verweist auf den Namensraum des importierten Moduls. Das importierte Modul entspricht also einer Variablen,

Daher wird das mehrmalige Importieren desselben Moduls nur dann ausgeführt, wenn es zum ersten Mal importiert wird

(Bei nachfolgenden Importen wird festgestellt, dass diese Modulvariable bereits vorhanden ist und nicht ausgeführt wird)

Pfadsuchmechanismus Jedes importierte Modul befindet sich im integrierten Python-Wörterbuch

sys.modules

Sobald Python startet, wird es automatisch in den Speicher geladen Nehmen Sie das Modul auf. Der Modulsuchpfadmechanismus von Python lautet: Lernen Sie den Importmechanismus des Python-Moduls und die Spezifikationen großer Projekte kennen

Überprüfen Sie, ob das Modul in allen Pfaden in

sys.path

vorhanden ist, und öffnen Sie in diesem Fall einen neuen Bereich zum Laden des Moduls. Überprüfen Sie, ob ein integriertes Paket vorhanden ist oder wurde in sys.modules installiert. Das installierte Paket eines Drittanbieters öffnet einen neuen Speicherplatz zum Laden des Moduls

  1. Wenn das Modul, das wir selbst geschrieben haben, gekapselt und auf PyPi veröffentlicht wird, kann es direkt installiert werden mit pip install und beim Start in den Speicher geladen. Sie können es über sys.modules anzeigen Für Module, die nur in diesem Projekt wiederverwendet werden müssen, fügen wir ihre Pfade zu sys.path im wiederverwendeten Code hinzu, und das Modul kann auch referenziert werden.
  2. Absoluter Pfadimport
Alle Modulimporte beginnen am „Wurzelknoten“. Der Speicherort des Root-Knotens wird durch den Pfad in sys.path bestimmt. Das Root-Verzeichnis des Projekts befindet sich normalerweise automatisch in sys.path. Wenn Sie möchten, dass das Programm überall ausgeführt wird, müssen Sie sys.path manuell ändern. Es kann nicht direkt im Paket ausgeführt werden (es wird ein Fehler gemeldet). Unabhängig davon, wo sich der Wurzelknoten befindet, ist die relative Position der Module innerhalb des Pakets korrekt.

import sys,os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))#项目根目录所在的绝对路径sys.path.append(BASE_DIR)import A, B #导入A、B包复制代码
Nach dem Login kopieren
FAQs zum Python-Modulimport

Beim Einzelimport eines Paketnamens werden nicht alle im Paket enthaltenen Submodule importiert. Lösung: Das importierte Paket enthält auch Importe aus anderen Paketen. Zu diesem Zeitpunkt müssen Sie alle Module unter dem Paket in die Datei

init

.py importieren. Nur die oberste Ebene kann direkt auf die Klassen des unteren Pakets verweisen . und Methode

init

-Datei

Wenn sich
    init
  • .py unter einem Ordner befindet, bedeutet dies, dass der Ordner ein Paket ist und mehrere Module darunter ein Ganzes bilden und diese Module in andere importiert werden können Code über dasselbe Paket. Unter anderem wird die Datei init.py zum Organisieren von Paketen verwendet, um die Verwaltung von Referenzen zwischen verschiedenen Modulen zu erleichtern und das Importverhalten von Paketen zu steuern.
Die Datei darf keinen Inhalt enthalten, das heißt, es ist eine leere Datei (wenn sie leer ist, kann nichts getan werden, indem man einfach das Formular „Importieren“ [Paket] verwendet). Sie muss nur existieren, was einer Markierung entspricht .

In Python3 meldet das Importpaket keinen Fehler, auch wenn sich unter dem Paket keine

init

.py-Datei befindet. In Python2 muss sich die Datei unter dem Paket befinden, andernfalls meldet das Importpaket einen Fehler all

variables

all ist eine wichtige Variable, die verwendet wird, um anzugeben, welche Module in [den aktuellen Bereich] importiert werden, wenn dieses Paket importiert wird *. Module, die nicht in der all-Liste enthalten sind, werden von anderen Programmen nicht referenziert. Sie können all

umschreiben, z. B.

all= [‚Name des aktuellen Paketmoduls 1‘, ‚Name des Moduls 1‘]. Wenn Sie dies schreiben, wird es entsprechend dem Modulnamen in der Liste importiert

name变量

在包内部直接运行时,包的name == 'main',但是在外部导入包是,可以通过

if __name__ == '__main__':复制代码
Nach dem Login kopieren

来避免实现包内部调试时的逻辑

循环导入

当两个模块A和B之间相互import时,就会出现循环导入的问题,此时程序运行会报错:can not import name xxx,如:

# a.pyprint('from a.py')from b import x

y = 'a'复制代码
Nach dem Login kopieren
# b.pyprint('from b.py')from a import y

x = 'b'复制代码
Nach dem Login kopieren

我们来分析一下这种错误是怎么出现的:

  1. 在sys.modules中查找 符号“module b”;
  2. 如果符号“module b”存在,则获得符号“module b”对应的module对象; 从的dict中获得 符号“x”对应的对象。如果“x”不存在,则抛出异常“ImportError: cannot import name ‘x’”
  3. 如果符号“module b”不存在,则创建一个新的 module对象。不过此时该新module对象的dict为空。然后执行module b.py文件中的语句,填充的dict

因此在a.py中执行from b import x的顺序就是1->3,先引入b,b里面from a import y由相当于执行了a.py,顺序是1->2,因为此时b已经引入所以不会执行3,2中无法找到x对象,因为引入b时还没执行到x='b'这一步,所以报错了

解决办法

  1. 延迟导入,把import语句写在方法/函数里,将它的作用域限制在局部;
  2. 顶层先引入模块,再把from x import y改成import x.y形式;
  3. 其实出现循环引用问题的根本原因是程序设计不合理,每个包都应该由上层使用的模块去导入,而不应该在包与包之间各种相互导入,所以应该更改代码布局,可合并或分离竞争资源;

大型项目中Python模块导入规范

分离模块,将同一类别的模块放在同一目录下,形成类别分明的目录架构,如:

Lernen Sie den Importmechanismus des Python-Moduls und die Spezifikationen großer Projekte kennen

  1. 每一个模块目录都要写init.py文件,可以同时定义all限定可导入的范围;
  2. 源码根目录可以定义BASE_DIR,限定好根目录路径,启动py文件可以用绝对路径导入各个模块,将必要模块都加入到sys.path中;
  3. 各个服务之间(例如model需要引入common的模块方法),可以通过相对路径引用模块;
  4. 程序设计时避免循环导入,可由调用者(服务文件)作为上层第三方引入需要的各个模块,这样就可以减少各个模块的相互导入。

更多相关免费学习推荐:python视频教程

Das obige ist der detaillierte Inhalt vonLernen Sie den Importmechanismus des Python-Moduls und die Spezifikationen großer Projekte kennen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:juejin.im
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage