Quando è utile utilizzare l'importazione in linea monouso in Python?
Per esempio:
__import__("x").doSomething()
Quanto sopra è mai più corto di quello sotto?
import x
x.doSomething()
O
from x import*
doSomething()
Quando è utile utilizzare l'importazione in linea monouso in Python?
Per esempio:
__import__("x").doSomething()
Quanto sopra è mai più corto di quello sotto?
import x
x.doSomething()
O
from x import*
doSomething()
Risposte:
Ciò può essere utile se si desidera utilizzare un modulo una sola volta in una funzione lambda anonima, in quanto consente di evitare di scrivere un'istruzione separata:
lambda x:__import__('SomeModule').foo(x,123)
è un byte più breve di
from SomeModule import*;f=lambda x:foo(x,123)
Se il codice è una funzione o un programma denominato, __import__
è improbabile che ti aiuti se non nelle circostanze più estreme o forzate.
import
sarebbe stato chiamato all'interno di un blocco rientrato? Probabilmente no.
f=
perché le funzioni anonime sono consentite e possono avere contenuti al di fuori della funzione .
Quando si importano più moduli con nomi sufficientemente lunghi, può essere utile assegnare la __import__
funzione a una variabile più corta e utilizzarla per le importazioni
Dichiarazioni di importazione regolari - 97 byte
da itertools import * dall'importazione datetime * elenco di stampa (permutazioni ("abc")) stampa datetime.now ()
Assegnando __import__
a i
- 94 byte:
i = __ import__ elenco di stampa (i ("itertools"). permutations ("abc")) print i ("datetime"). datetime.now ()
__import__("x").doSomething()
necessita di oltre 15 caratteri x per fare riferimento a un modulo con un nome di lunghezza x .
import x\nx.doSomething()
richiede 9 + 2 * x caratteri. Queste funzioni si sovrappongono a x = 6, quindi rispetto a questo modo qualsiasi modulo con un nome più lungo è meglio usare __import__
, qualsiasi cosa più breve trae vantaggio dalle normali importazioni:
Tuttavia, from x import*\ndoSomething()
richiede solo 14+ caratteri x , quindi rispetto alla normale importazione non ne vale la pena a meno che il nome del modulo non sia più lungo di 5 caratteri:
Tutto questo presuppone che ti riferisci a una funzione / classe / qualunque cosa una sola volta. Se ti riferisci ad esso più di una volta, le formule cambiano e quest'ultima versione potrebbe diventare il vincitore. Nel caso in cui usi più volte qualcosa di lungo da un modulo importato, vince un'altra versione:
from x import y as z
ti mette a segno 18+ x + y + z * ( n +1) caratteri per n usi di z , il che è un grande miglioramento se y è grande, perché z può essere fatto 1.
__import__("x").doSomething()
che sia un carattere più corto di from x import*;doSomething()
. Forse stai contando la newline come due caratteri? E ricordo che il punto di pareggio è 5, compreso tra time
e random
.
z=__import__("x").y
è un byte più corto difrom x import y as z
from x import*;z=y
.
__import__
aiuterebbe all'interno di una funzione denominata poiché sarebbe all'interno di un blocco rientrato. Un'importazione avrebbe un costo in più poiché è su due righe e rientrata. (Ciò presuppone che le importazioni non siano consentite al di fuori della funzione.)