Wann ist es sinnvoll, Inline-Importe zum einmaligen Gebrauch in Python zu verwenden?
Beispielsweise:
__import__("x").doSomething()
Ist das Oben immer kürzer als das Unten?
import x
x.doSomething()
Oder
from x import*
doSomething()
Wann ist es sinnvoll, Inline-Importe zum einmaligen Gebrauch in Python zu verwenden?
Beispielsweise:
__import__("x").doSomething()
Ist das Oben immer kürzer als das Unten?
import x
x.doSomething()
Oder
from x import*
doSomething()
Antworten:
Dies kann nützlich sein, wenn Sie ein Modul nur einmal in einer anonymen Lambda-Funktion verwenden möchten, da Sie so vermeiden können, eine separate Anweisung zu schreiben:
lambda x:__import__('SomeModule').foo(x,123)
ist ein Byte kürzer als
from SomeModule import*;f=lambda x:foo(x,123)
Wenn es sich bei dem Code um eine benannte Funktion oder ein benanntes Programm handelt, __import__
ist es unwahrscheinlich, dass dies hilfreich ist, es sei denn, es handelt sich um die extremsten oder erfundensten Umstände.
import
der innerhalb eines eingerückten Blocks aufgerufen würde? Wahrscheinlich nicht.
f=
da anonyme Funktionen zulässig sind und Inhalte außerhalb der Funktion enthalten können .
Wenn Sie mehrere Module mit ausreichend langen Namen importieren, kann es hilfreich sein, die __import__
Funktion einer kürzeren Variablen zuzuweisen und für den Import zu verwenden
Regelmäßige Importanweisungen - 97 Bytes
aus itertools importieren * vom datetime-Import * Liste drucken (Permutationen ("abc")) print datetime.now ()
Zuweisen __import__
zu i
- 94 Bytes:
i = __ import__ Liste drucken (i ("itertools"). Permutationen ("abc")) print i ("datetime"). datetime.now ()
__import__("x").doSomething()
benötigt mehr als 15 x Zeichen, um auf ein Modul mit dem Namen Länge x zu verweisen .
import x\nx.doSomething()
benötigt 9 + 2 * x Zeichen. Diese Funktionen überlappen sich bei x = 6, so dass im Vergleich zu dieser Methode jedes Modul mit einem längeren Namen besser verwendet __import__
werden kann. Kürzere Funktionen profitieren von normalen Importen:
from x import*\ndoSomething()
Benötigt jedoch nur mehr als 14 x Zeichen, so dass es sich im Vergleich zum normalen Import nur lohnt, wenn der Modulname länger als 5 Zeichen ist:
Dies alles setzt voraus, dass Sie sich nur einmal auf eine Funktion / Klasse / was auch immer beziehen. Wenn Sie mehrmals darauf verweisen, ändern sich die Formeln, und die letztere Version wird möglicherweise zum Gewinner. Wenn Sie mehrmals etwas Langes aus einem importierten Modul verwenden, gewinnt eine weitere Version:
from x import y as z
Sie erhalten 18+ x + y + z * ( n +1) Zeichen für n Verwendungen von z , was eine große Verbesserung darstellt, wenn y groß ist, da z zu 1 gemacht werden kann.
__import__("x").doSomething()
einen Char kürzer als from x import*;doSomething()
. Vielleicht zählst du den Zeilenumbruch als zwei Zeichen? Und ich erinnere mich, dass der Break-Even-Punkt 5 ist und zwischen time
und liegt random
.
z=__import__("x").y
ist ein Byte kürzer alsfrom x import y as z
from x import*;z=y
.
__import__
würde innerhalb einer benannten Funktion helfen, da sie sich innerhalb eines eingerückten Blocks befindet. Ein Import würde extra kosten, da er in zwei Zeilen und eingerückt ist. (