¿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()
¿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()
Respuestas:
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
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 importar
Declaraciones de importación regulares - 97 bytes
de itertools import * desde la importación de fecha y hora * imprimir lista (permutaciones ("abc")) print datetime.now ()
Asignación __import__
a i
- 94 bytes:
i = __ import__ imprimir lista (i ("itertools"). permutaciones ("abc")) print i ("datetime"). datetime.now ()
__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.
__import__("x").doSomething()
ser un personaje más corto que from 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 entre time
y random
.
z=__import__("x").y
es un byte más corto quefrom x import y as z
from x import*;z=y
.
__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.)