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()
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.)import
seria chamado dentro de um bloco recuado? Provavelmente não.f=
porque funções anônimas são permitidas e podem ter conteúdo fora da função .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çõesExemplo:
Instruções de importação regulares - 97 bytes
Atribuindo
__import__
ai
- 94 bytes:fonte
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 z
permite 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.fonte
__import__("x").doSomething()
que é um caractere mais curto quefrom 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 entretime
erandom
.z=__import__("x").y
é um byte menor quefrom x import y as z
from x import*;z=y
.