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.