Golfe com importação de Python


16

Quando é benéfico usar a importação inline e de uso único em Python?

Por exemplo:

__import__("x").doSomething()

O acima é sempre mais curto que o abaixo?

import x
x.doSomething()

Ou

from x import*
doSomething()

Respostas:


11

Isso pode ser útil se você quiser usar um módulo apenas uma vez em uma função lambda anônima, pois permite evitar escrever uma instrução separada:

lambda x:__import__('SomeModule').foo(x,123)

é um byte menor que

from SomeModule import*;f=lambda x:foo(x,123)

Se o código for uma função ou programa nomeado, __import__é improvável que ajude, exceto nas circunstâncias mais extremas ou inventadas.


__import__ajudaria dentro de uma função nomeada, pois estaria dentro de um bloco recuado. Uma importação custaria um valor extra, pois é em duas linhas e recuada. (Isso supondo que as importações não são permitidos fora da função.)
Alex A.

@AlexA Não vejo problema em colocar importações fora de uma função nomeada.
feersum

Então, algum dia importseria chamado dentro de um bloco recuado? Provavelmente não.
Alex A.

colocar importações fora da função nomeada não funcionará para desafios em que você está escrevendo apenas uma função.
Sparr

6
O segundo exemplo não requer o f=porque funções anônimas são permitidas e podem ter conteúdo fora da função .
Xnor

4

Ao importar vários módulos com nomes suficientemente longos, pode ser útil atribuir a __import__função a uma variável mais curta e usá-la para importações

Exemplo:

Instruções de importação regulares - 97 bytes

de itertools import *
da importação de data e hora *
imprimir lista (permutações ("abc"))
imprima datetime.now ()

Atribuindo __import__a i- 94 bytes:

i = __ import__
imprimir lista (i ("itertools"). permutações ("abc"))
imprima i ("datetime"). datetime.now ()

1

Quase nunca.

__import__("x").doSomething()precisa de mais de 15 caracteres x para se referir a um módulo com um nome de comprimento x .

import x\nx.doSomething()precisa de 9 + 2 * x caracteres. Essas funções se sobrepõem em x = 6; portanto, comparado a esse modo, é melhor usar qualquer módulo com um nome mais longo __import__, e qualquer benefício menor das importações normais:

No entanto, from x import*\ndoSomething()precisa de apenas 14 ou mais caracteres x , portanto, comparado à importação normal, não vale a pena, a menos que o nome do módulo tenha mais de 5 caracteres:

Tudo isso pressupõe que você está se referindo a uma função / classe / qualquer outra vez. Se você se referir a ele mais de uma vez, as fórmulas mudam e a última versão pode se tornar a vencedora. Caso você use algo longo de um módulo importado várias vezes, outra versão vence:

from x import y as zpermite que você use mais de 18 caracteres x + y + z * ( n +1) para n usos de z , o que é uma grande melhoria se y for grande, porque z pode ser feito 1.


11
Você pode verificar sua matemática? Acho __import__("x").doSomething()que é um caractere mais curto que from x import*;doSomething(). Talvez você esteja contando a nova linha como dois caracteres? E eu me lembro do ponto de equilíbrio sendo 5, caindo entre timee random.
xnor

@xnor Não contei novas linhas duas vezes, mas perdi que você não precisa do ponto nessa versão. Me dê um minuto, eu vou atualizar.
L3viathan

11
z=__import__("x").yé um byte menor quefrom x import y as z
negativo sete /

11
@negativeseven Shorter: from x import*;z=y.
L3viathan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.