Jugar al golf con Python Import

16

¿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()
Decaimiento Beta
fuente

Respuestas:

11

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.

Feersum
fuente
__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.)
Alex A.
@AlexA No veo ningún problema al colocar importaciones fuera de una función con nombre.
fiesta
Entonces, ¿alguna vez habría un momento en importque se llamaría dentro de un bloque sangrado? Probablemente no.
Alex A.
colocar importaciones fuera de la función nombrada no funcionará para los desafíos en los que está escribiendo solo una función.
Sparr
4

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

Ejemplo:

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 ()
siete negativo
fuente
1

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 zle 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.

L3viatán
fuente
1
¿Puedes revisar tus matemáticas? Me parece __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 timey random.
xnor
@xnor No conté las líneas nuevas dos veces, pero extrañé que no necesitaras el punto en esa versión. Dame un minuto, lo actualizaré.
L3viathan
1
z=__import__("x").yes un byte más corto quefrom x import y as z
negativo siete
1
@negativeseven Shorter: from x import*;z=y.
L3viathan