tag requests read parse page fromstring python if-statement python-import

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.