Giocare a golf con Python Import


16

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:


11

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__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.)
— Alex A.

@AlexA Non vedo alcun problema nel posizionare le importazioni al di fuori di una funzione denominata.
— feersum

Quindi ci sarebbe mai stato un momento in cui importsarebbe stato chiamato all'interno di un blocco rientrato? Probabilmente no.
— Alex A.

posizionare le importazioni al di fuori della funzione denominata non funzionerà per le sfide in cui si sta scrivendo solo una funzione.
— Sparr

6
Il secondo esempio non richiede il f=perché le funzioni anonime sono consentite e possono avere contenuti al di fuori della funzione .
— xnor

4

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

Esempio:

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 ()

1

Quasi mai.

__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 zti 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.


1
Puoi controllare la tua matematica? Trovo __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 timee random.
— xnor

@xnor Non ho contato due volte le righe, ma mi è mancato il punto in quella versione. Dammi un minuto, aggiornerò.
— L3viathan

1
z=__import__("x").yè un byte più corto difrom x import y as z
— negativo sette

1
@negativeseven Shorter: from x import*;z=y.
— L3viathan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.