Cinco métodos de sobrecarga de módulos de Python

Preparación ambiental

Cree una nueva carpeta foo, que contiene un archivo bar.py

$ tree foo
foo
└── bar.py

0 directories, 1 file

El contenido de bar.py es muy simple, solo escriba una declaración impresa

print("successful to be imported")

Siempre que bar.py se importe una vez, se ejecutará una vez que se imprima

Sin importación duplicada

'Debido a la existencia de sys.modules, cuando importa un módulo importado, en realidad es ineficaz. '

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>

Repita el método de importación uno

Si usa python2 (recuerde agregar uno debajo de la carpeta foo antes __init__.py), hay un método de recarga que se puede usar directamente

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> reload(bar)
successful to be imported
<module 'foo.bar' from 'foo/bar.pyc'>

Si usa python3, hay más métodos, consulte los detalles a continuación.

Repita el método de importación dos

Si usa Python3.0 -> 3.3, entonces puede usar el método imp.reload

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> import imp
>>> imp.reload(bar)
successful to be imported
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>

Pero este método no se recomienda en Python 3.4+

<stdin>:1: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses

Repita el método de importación tres

Si está utilizando Python 3.4+, utilice el método importlib.reload

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> import importlib
>>> importlib.reload(bar)
successful to be imported
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>

Repita el método de importación cuatro

Si sabe algo sobre el cargador de paquetes

También puede utilizar el siguiente método

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> bar.__spec__.loader.load_module()
successful to be imported
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>

Repita el método de importación cinco

Dado que son sys.modules los que afectan nuestra importación repetida, ¿deberíamos simplemente eliminar el paquete importado?

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> import foo.bar
successful to be imported
>>>
>>> import foo.bar
>>>
>>> import sys
>>> sys.modules['foo.bar']
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>
>>> del sys.modules['foo.bar']
>>>
>>> import foo.bar
successful to be imported

¿Ha encontrado que en el ejemplo anterior usé de foo import bar, pero en este ejemplo, usé import foo.bar?

Esto se debe a que si usa desde foo import bar este método, no es válido usar el método de eliminar sys.modules para recargar el módulo.

Esto debe considerarse como un pozo pequeño. Las personas que no lo saben caerán al pozo y no podrán salir.

>>> import foo.bar
successful to be imported
>>>
>>> import foo.bar
>>>
>>> import sys
>>> del sys.modules['foo.bar']
>>> from foo import bar
>>>

Supongo que te gusta

Origin blog.csdn.net/sinat_38682860/article/details/109313011
Recomendado
Clasificación