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()

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.


__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 ()

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.