Heim  >  Artikel  >  Backend-Entwicklung  >  Vergleichen Sie die Nutzungsunterschiede von import reload __import__ in Python

Vergleichen Sie die Nutzungsunterschiede von import reload __import__ in Python

巴扎黑
巴扎黑Original
2017-09-19 10:45:101790Durchsuche

importieren

Funktion: Importieren/Einführen eines Python-Standardmoduls, das .py-Dateien und Verzeichnisse mit __init__.py-Dateien (benutzerdefinierte Module) enthält.

import module_name[,module1,...]

from module import *|child[,child1,...]

Hinweis: Verwenden Sie die Importanweisung mehrmals , wird das angegebene Modul nicht neu geladen, aber die Speicheradresse des Moduls wird auf die lokale Variablenumgebung verwiesen.

Beispiel:

pythontab.py

#!/usr/bin/env python    
#encoding: utf-8  
import os  
print 'in pythontab',id(os)

test.py

#!/usr/bin/env python    
#encoding: utf-8  
import pythontab   #第一次会打印pythontab里面的语句  
import os  #再次导入os后,其内存地址和pythontab里面的是一样的,因此这里只是对os的本地引用  
print 'in c',id(os)  
import pythontab  #第二次不会打印pythontab里面的语句,因为没有重新加载

reload

Funktion: Zum Laden der Das Modul wird neu geladen, was im Allgemeinen in Sondersituationen wie Änderungen am Originalmodul verwendet wird. Das Modul muss vor dem Neuladen importiert worden sein.

import os

reload(os)

Hinweis:

reload lädt das geladene Modul neu, aber die ursprünglich verwendete Instanz wird weiterhin verwendet. Das alte Modul, und die neu erstellte Instanz verwendet das neue Modul. Nach dem Neuladen wird die ursprüngliche Speicheradresse weiterhin verwendet. . Import. . Formatmodul wird neu geladen.

Beispiel:

pythontab.py

#!/usr/bin/env python    
#encoding: utf-8  
import os  
print 'in pythontab',id(os)

test.py

#!/usr/bin/env python    
#encoding: utf-8  
import pythontab   #第一次import会打印pythontab里面的语句  
print id(pythontab) #原来pythontab的内存地址  
reload(pythontab)  #第二次reload还会打印pythontab里面的语句,因为有重新加载  
print id(pythontab) #reload后pythontab的内存地址,和原来一样

Erweiterung:

oben Wie bereits erwähnt, wird die Reload-Funktion nur unter besonderen Umständen verwendet; in welchen anderen Situationen ist die Verwendung der Reload-Funktion zusätzlich zu Änderungen an der ursprünglichen Moduldatei erforderlich?

#!/usr/bin/env python    
#encoding: utf-8  
import sys   #引用sys模块进来,并不是进行sys的第一次加载  
reload(sys)  #重新加载sys  
sys.setdefaultencoding('utf8')  ##调用setdefaultencoding函数

Der obige Code ist korrekt, dann testen Sie den folgenden Code

#!/usr/bin/env python    
#encoding: utf-8  
import sys     
sys.setdefaultencoding('utf8')

Der obige Test schlägt fehl. Warum müssen Sie also zuerst das Systemmodul neu laden, wenn Sie setdefaultencoding aufrufen? Wollstoff? Da es sich bei der Importanweisung hier nicht um die erste Importanweisung von sys handelt, handelt es sich möglicherweise tatsächlich um den zweiten oder dritten Import des sys-Moduls. Dies ist nur ein Verweis auf sys und kann nur durch erneutes Laden neu geladen werden. Warum muss es dann neu geladen werden, die Funktion kann jedoch nicht aufgerufen werden, wenn direkt darauf verwiesen wird? Da die Funktion setdefaultencoding nach dem Aufruf durch das System gelöscht wird, ist sie nicht mehr vorhanden, wenn sie durch den Import referenziert wird. Daher muss das sys-Modul einmal neu geladen werden, damit setdefaultencoding verfügbar ist und die aktuelle Zeichenkodierung des Interpreters verfügbar ist im Code geändert. Probieren Sie den folgenden Code aus, derselbe Fehler wird gemeldet:

#!/usr/bin/env python    
#encoding: utf-8  
import sys    
reload(sys)   
sys.setdefaultencoding('utf8')    
del sys.setdefaultencoding   ##删除原来的setdefaultencoding函数     
sys.setdefaultencoding('gb2312')

Wer hat also zuvor sys importiert und die Funktion setdefaultencoding aufgerufen? Die Antwort befindet sich im Lib-Ordner des Python-Installationsverzeichnisses. Es gibt eine Datei namens site.py [python2.6], in der Sie main() -->sys.setdefaultencoding( finden. kodierung), da diese site.py jedes Mal automatisch geladen wird, wenn der Python-Interpreter gestartet wird, sodass die Hauptfunktion jedes Mal ausgeführt wird und die Funktion setdefaultencoding gelöscht wird, sobald sie herauskommt.

__import__

Funktion:

hat die gleiche Funktion wie die Importanweisung, aber __import__ ist eine Funktion und empfängt nur Zeichenfolgen als Parameter, daher ist seine Funktion Sie wissen es. Tatsächlich ruft die Importanweisung diese Funktion auf, um die Importarbeit auszuführen import sys 209861d5cd2975725c730f519ed6ad71sys = __import__('sys')

Verwenden Sie:

__import__(module_name[, globals[, locals[, fromlist]]]) #Die optionalen Parameter sind standardmäßig globals(), locals(),[]

__import__('os')

__import__('os' ,globals( ),locals(),['path','pip']) #Entspricht from os import path, pip

Hinweis:

Normalerweise kann diese Funktion während der Dynamik verwendet werden Wenn Sie beispielsweise alle Module in einem Ordner laden möchten, sich die Modulnamen darunter jedoch häufig ändern, können Sie mit dieser Funktion alle Module dynamisch laden. Das häufigste Szenario ist die Unterstützung von Plug-In-Funktionen.

Erweiterung:

Können Module dynamisch über Strings neu geladen werden, da Module dynamisch über Strings importiert werden können? Versuchen Sie reload('os'), um einen Fehler direkt zu melden. Obwohl Sie nicht direkt neu laden können, können Sie ein Modul zuerst deimportieren und dann __import__, um das Modul neu zu laden. Sehen wir uns nun an, wie der unimport-Vorgang implementiert wird. In der Python-Interpretation können Sie die in der aktuellen Umgebung geladenen Module und ihre Speicherorte über globals(), locals(), vars(), dir() und andere Funktionen anzeigen kann nur angezeigt werden, daher kann der Import nicht aufgehoben werden. Es gibt jedoch einen anderen Ort, an dem Module gespeichert werden können: sys.modules. Über sys.modules können Sie alle geladenen und erfolgreichen Module anzeigen, und es gibt mehr als nur globale Module , was darauf hinweist, dass standardmäßig einige zusätzliche Module geladen werden und der nächste Schritt der Deimport ist.

#!/usr/bin/env python    
#encoding: utf-8  
import sys  
__import__('a')      #第一次导入会打印消息  
del sys.modules['a']   #unimport  
__import__('a')    #再次导入还是会打印消息,因为已经unimport一次了  
__import__('a')    #这次就不会打印消息了

Das obige ist der detaillierte Inhalt vonVergleichen Sie die Nutzungsunterschiede von import reload __import__ in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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