Gra w golfa za pomocą Python Import

16

Kiedy warto korzystać z importowania w trybie pojedynczego, importu jednorazowego w Pythonie?

Na przykład:

__import__("x").doSomething()

Czy powyższe jest zawsze krótsze niż poniżej?

import x
x.doSomething()

Lub

from x import*
doSomething()
Rozpad beta
źródło

Odpowiedzi:

11

Może to być przydatne, jeśli chcesz użyć modułu tylko raz w anonimowej funkcji lambda, ponieważ pozwala uniknąć pisania osobnej instrukcji:

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

jest o jeden bajt krótszy niż

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

Jeśli kod jest nazwaną funkcją lub programem, __import__jest mało prawdopodobne, aby był pomocny, z wyjątkiem najbardziej ekstremalnych lub wymyślonych okoliczności.

feersum
źródło
__import__pomógłby wewnątrz nazwanej funkcji, ponieważ byłaby wewnątrz wciętego bloku. Import będzie kosztował więcej, ponieważ jest w dwóch liniach i wcięty. (Zakłada się, że importowanie nie jest dozwolone poza funkcją.)
Alex A.
@AlexA Nie widzę problemu z umieszczeniem importu poza nazwaną funkcją.
feersum
Czy kiedykolwiek byłby czas, w którym importzostałby wywołany w wciętym bloku? Prawdopodobnie nie.
Alex A.,
umieszczanie importów poza nazwaną funkcją nie będzie działać w przypadku wyzwań, w których piszesz tylko jedną funkcję.
Sparr
6
Drugi przykład nie wymaga, f=ponieważ anonimowe funkcje są dozwolone i mogą zawierać treści poza funkcją .
xnor
4

Podczas importowania wielu modułów o wystarczająco długich nazwach pomocne może być przypisanie __import__funkcji do krótszej zmiennej i użycie jej do importu

Przykład:

Regularne instrukcje importu - 97 bajtów

z importu itertools *
z importu daty / godziny *
lista drukowania (permutacje („abc”))
print datetime.now ()

Przypisywanie __import__do i- 94 bajtów:

i = __ import__
lista drukowania (i („itertools”). permutacje („abc”))
print i („datetime”). datetime.now ()
ujemna siódemka
źródło
1

Prawie nigdy.

__import__("x").doSomething()potrzebuje 15+ x znaków, aby odnosić się do modułu o nazwie długości x .

import x\nx.doSomething()potrzebuje 9 + 2 * x znaków. Funkcje te nakładają się na x = 6, więc w porównaniu z tym sposobem lepiej jest użyć dowolnego modułu o dłuższej nazwie __import__, cokolwiek krótszego korzysta z normalnego importu:

Jednak from x import*\ndoSomething()wymaga tylko 14+ x znaków, więc w porównaniu do normalnego importu nie jest tego warte, chyba że nazwa modułu jest dłuższa niż 5 znaków:

To wszystko zakłada, że ​​masz na myśli funkcję / klasę / cokolwiek tylko raz. Jeśli odwołujesz się do niego więcej niż raz, formuły się zmieniają, a ta ostatnia wersja może zostać zwycięzcą. Jeśli kilkakrotnie użyjesz czegoś długiego z importowanego modułu, wygrywa jeszcze jedna wersja:

from x import y as zdaje ci 18+ x + y + z * ( n +1) znaków dla n zastosowań z , co jest dużym ulepszeniem, jeśli y jest duże, ponieważ z można wykonać 1.

L3viathan
źródło
1
Czy potrafisz sprawdzić swoją matematykę? Uważam, że jestem __import__("x").doSomething()o jeden węgiel krótszy niż from x import*;doSomething(). Może liczysz nowy wiersz jako dwa znaki? I przypominam sobie, że próg rentowności wynosi 5, mieszcząc się między timea random.
xnor
@ xnor Nie liczyłem dwa razy nowego wiersza, ale spudłowałem, że nie potrzebujesz kropki w tej wersji. Daj mi chwilę, zaktualizuję.
L3viathan
1
z=__import__("x").yjest bajtem krótszym niżfrom x import y as z
minus siedem
1
@negativeseven Shorter: from x import*;z=y.
L3viathan