requests - Python-importar en si
requests html python (4)
Escribí un pequeño contenedor para urllib (python3). ¿Es correcto y seguro importar módulo en si ?
if self.response_encoding == ''gzip'':
import gzip
No encontré ningún PEP sobre este código. Sin embargo, me molesta.
¿Es seguro? Sí. Como la respuesta de Martijin señaló que Official Python usa esto.
¿Es correcto? Depende. Los documentos de rendimiento de Python señalan que aunque Python puede evitar importar el mismo módulo, todavía hay sobrecarga.
Así que creo que deberías preguntarte, con qué frecuencia la afirmación if es cierta. Si es muy frecuente, habrá una gran sobrecarga y deberá importarla al principio del archivo. Si no es frecuente, entonces importe en la declaración if si es una buena elección.
Claro, eso está bien. Incluso puede ser necesario en los casos en que el módulo tenga un código de inicialización que no siempre desea ejecutar.
Este es un idioma bastante común en realidad. A veces lo verás para elegir entre diferentes módulos:
if system == ''linux'':
import linuxdeps as deps
elif system == ''win32'':
import win32deps as deps
Luego, asumiendo que tanto linuxdeps
como win32deps
tienen las mismas funciones, puedes usarlo:
deps.func()
Esto incluso se usa para obtener os.path
en la biblioteca estándar (a continuación se os.path
parte del código fuente para os
):
if ''posix'' in _names:
name = ''posix''
linesep = ''/n''
from posix import *
try:
from posix import _exit
except ImportError:
pass
import posixpath as path
import posix
__all__.extend(_get_exports_list(posix))
del posix
elif ''nt'' in _names:
name = ''nt''
linesep = ''/r/n''
from nt import *
try:
from nt import _exit
except ImportError:
pass
import ntpath as path
import nt
__all__.extend(_get_exports_list(nt))
del nt
La biblioteca estándar de Python lo utiliza, por lo que es definitivamente correcto y seguro. Vea la fuente del módulo OS para un excelente ejemplo:
if ''posix'' in _names: name = ''posix'' linesep = ''/n'' from posix import * try: from posix import _exit except ImportError: pass import posixpath as path import posix __all__.extend(_get_exports_list(posix)) del posix
Es bastante común importar módulos de forma condicional en Python. En lugar de if
, a menudo verá una combinación try:
/ except ImportError:
:
try:
from subprocess import check_output
except ImportError:
# Python 2.6 and before
def check_output(*popenargs, **kwargs):
from subprocess import Popen
if ''stdout'' in kwargs:
raise ValueError(''stdout argument not allowed, it will be ''
''overridden.'')
process = Popen(stdout=PIPE, *popenargs, **kwargs)
output, unused_err = process.communicate()
retcode = process.poll()
if retcode:
cmd = kwargs.get("args")
if cmd is None:
cmd = popenargs[0]
raise CalledProcessError(retcode, cmd)
return output
Aquí, básicamente, utilizamos el equivalente moral de una prueba if
: Si puede importar check_output
, check_output
, de lo contrario, defina la función completa aquí.
Una declaración de importación es solo un nuevo enlace de una pieza externa de código a un nombre local. El uso de un flujo de control if
para controlar la importación no es diferente de asignar una variable en una sentencia if
al respecto. Debe asegurarse de no terminar usando el nombre sin que esté definido de ninguna manera.