Operación deslumbrante de Python: cinco métodos de sobrecarga de módulos

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 se escribe 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 no es efectivo. '

>>> 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 en la carpeta foo antes __init__.py), hay un método de recarga que se puede usar directamente

>>> 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, 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

>>> 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 (para obtener más detalles, puede leer el artículo que escribí antes: https://iswbm.com/84.html)

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?

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

¿Has descubierto que en el ejemplo anterior lo usé todo from foo import bar, pero en este ejemplo lo usé import foo.bar?

Esto se debe a que si lo usa de from foo import baresta manera, desea eliminar el módulo sys.modules para anular este método no es válido.

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

Recomiendo mi libro electrónico original " PyCharm Chinese Guide ", que contiene una gran cantidad (300) de ilustraciones , está bien hecho y es digno de una colección de todos los ingenieros de Python.

La dirección es: http://pycharm.iswbm.com

Supongo que te gusta

Origin blog.csdn.net/weixin_36338224/article/details/109065152
Recomendado
Clasificación