La regla general es que las importaciones deben estar en la parte superior del archivo , ya que hace que el código sea más fácil de seguir, y eso hace que sea más fácil averiguar qué necesitará un módulo sin tener que pasar por todo el código.
La guía de estilo de Python cubre algunas pautas básicas para las importaciones de cómo deben mirar: http://www.python.org/dev/peps/pep-0008/#imports
En la práctica, sin embargo, hay ocasiones en las que tiene sentido para importar desde dentro de una función en particular. Esto viene a colación con las importaciones que sería circular:
# Module 1
from module2 import B
class A(object):
def do_something(self):
my_b = B()
...
# Module 2
from module1 import A
class B(object):
def do_something(self):
my_a = A()
...
que no funciona como es, pero se puede conseguir alrededor de la circularidad moviendo la importación:
# Module 1
from module2 import B
class A(object):
def do_something(self):
my_b = B()
...
# Module 2
class B(object):
def do_something(self):
from module1 import A
my_a = A()
...
Lo ideal sería diseñar el clases tales que nunca aparecerían, y tal vez incluso incluirlas en el mismo módulo. En ese ejemplo de juguete, tener cada importación del otro realmente no tiene sentido. Sin embargo, en la práctica, hay algunos casos en los que tiene más sentido incluir una importación para un método dentro del método en sí, en lugar de tirar todo en el mismo módulo, o extraer el método en cuestión a otro objeto.
Pero, a menos que tenga una buena razón para desviarse, digo que vaya con la convención de la parte superior del módulo.
Todavía un poco confundido. ¿De todos modos, el cargador NO tendrá que cargar el módulo externo, solo en caso de que se llame a una excepción? La única sobrecarga que puedo ver es solo una línea adicional de código en la excepción. – tetris11
Simplemente sea claro en su código, haga sus importaciones en la parte superior del archivo. –
@JakobBowyer Pero cuál es la diferencia, en lo que respecta al rendimiento es lo que realmente estoy preguntando – tetris11