¿Cuándo es beneficioso usar la importación en línea, de un solo uso en Python?
Por ejemplo:
__import__("x").doSomething()
¿Lo anterior es cada vez más corto que lo siguiente?
import x
x.doSomething()
O
from x import*
doSomething()
Esto puede ser útil si desea usar un módulo solo una vez en una función lambda anónima, ya que le permite evitar escribir una declaración separada:
lambda x:__import__('SomeModule').foo(x,123)
es un byte más corto que
from SomeModule import*;f=lambda x:foo(x,123)
Si el código es una función o programa con nombre, __import__
es poco probable que ayude, excepto en las circunstancias más extremas o artificiales.
__import__
ayudaría dentro de una función con nombre ya que estaría dentro de un bloque sangrado. Una importación costaría más, ya que está en dos líneas y con sangría. (Eso supone que las importaciones no están permitidas fuera de la función.)import
que se llamaría dentro de un bloque sangrado? Probablemente no.f=
porque las funciones anónimas están permitidas y pueden tener contenido fuera de la función .Al importar varios módulos con nombres suficientemente largos, puede ser útil asignar la
__import__
función a una variable más corta y usarla para importarEjemplo:
Declaraciones de importación regulares - 97 bytes
Asignación
__import__
ai
- 94 bytes:fuente
Casi nunca.
__import__("x").doSomething()
necesita más de 15 caracteres x para referirse a un módulo con un nombre de longitud x .import x\nx.doSomething()
necesita 9 + 2 * x caracteres. Estas funciones se superponen en x = 6, por lo que en comparación con cualquier módulo con un nombre más largo es mejor usar__import__
, cualquier cosa más corta se beneficia de las importaciones normales:Sin embargo,
from x import*\ndoSomething()
solo necesita más de 14 caracteres x , por lo que, en comparación con la importación normal, no vale la pena a menos que el nombre del módulo tenga más de 5 caracteres:Todo esto supone que se está refiriendo a una función / clase / lo que sea solo una vez. Si lo consulta más de una vez, las fórmulas cambian y la última versión podría convertirse en la ganadora. En caso de que use algo largo de un módulo importado varias veces, otra versión gana:
from x import y as z
le proporciona 18+ x + y + z * ( n +1) caracteres para n usos de z , lo cual es una gran mejora si y es grande, porque se puede hacer z 1.fuente
__import__("x").doSomething()
ser un personaje más corto quefrom x import*;doSomething()
. ¿Tal vez estás contando la nueva línea como dos caracteres? Y recuerdo que el punto de equilibrio fue 5, cayendo entretime
yrandom
.z=__import__("x").y
es un byte más corto quefrom x import y as z
from x import*;z=y
.