Python'da satır içi, tek kullanımlık içe aktarmayı kullanmak ne zaman yararlıdır?
Örneğin:
__import__("x").doSomething()
Yukarıdakiler aşağıdakilerden daha kısa mı?
import x
x.doSomething()
Veya
from x import*
doSomething()
Python'da satır içi, tek kullanımlık içe aktarmayı kullanmak ne zaman yararlıdır?
Örneğin:
__import__("x").doSomething()
Yukarıdakiler aşağıdakilerden daha kısa mı?
import x
x.doSomething()
Veya
from x import*
doSomething()
Yanıtlar:
Ayrı bir ifade yazmaktan kaçınmanıza izin verdiği için, anonim lambda işlevinde bir modülü yalnızca bir kez kullanmak istiyorsanız bu yararlı olabilir:
lambda x:__import__('SomeModule').foo(x,123)
bir bayt daha kısa
from SomeModule import*;f=lambda x:foo(x,123)
Kod adlandırılmış bir işlev __import__
veya programsa, en uç veya çelişkili durumlar dışında yardımcı olma olasılığı düşüktür.
import
girintili bir bloğun içine çağrılacak bir zaman olur muydu? Muhtemelen değil.
f=
, çünkü anonim fonksiyonlar izin verilir ve içerik dışında fonksiyonu olabilir .
Yeterince uzun adlara sahip birden fazla modül içe aktarırken, __import__
işlevi daha kısa bir değişkene atamak ve içe aktarma için kullanmak yardımcı olabilir
Düzenli ithalat bildirimleri - 97 bayt
itertools ithalatından * datetime ithalatından * listeyi yazdır (permütasyonlar ("abc")) print datetime.now ()
Atama __import__
için i
- 94 bayt:
i = __ import__ listeyi yazdır (i ("itertools"). permütasyonlar ("abc")) print i ("datetime"). datetime.now ()
__import__("x").doSomething()
15+ ihtiyacı x uzunluk bir adla bir modül başvurmak için karakterleri x .
import x\nx.doSomething()
9 + 2 * x karakter gerektirir. Bu işlevler x = 6 ile çakışır , bu nedenle bu şekilde daha uzun ada sahip herhangi bir modül daha iyi kapalıdır __import__
, normal içe aktarmalardan daha kısa faydalar sağlar:
Bununla birlikte, from x import*\ndoSomething()
sadece 14+ x karaktere ihtiyaç duyar , bu nedenle modül adı 5 karakterden uzun olmadığı sürece normal içe aktarmaya kıyasla buna değmez:
Tüm bunlar, sadece bir kez bir işleve / sınıfa / neye başvurduğunuzu varsayar. Bir kereden fazla başvurursanız, formüller değişir ve ikinci sürüm kazanan olabilir. İçe aktarılan bir modülden uzun bir süre birkaç kez kullanmanız durumunda, başka bir sürüm kazanır:
from x import y as z
ağları Eğer 18 + x + y + z * ( n + 1) karakterleri için n kullanımları z ise büyük bir gelişmedir, y büyük olduğundan, z 1 yapılabilir.
__import__("x").doSomething()
daha kısa bir karakter buluyorum from x import*;doSomething()
. Belki yeni satırı iki karakter olarak sayıyorsunuz? Ve başabaş noktası, 5 olmak arasında düşen hatırlama time
ve random
.
z=__import__("x").y
bir bayt daha kısafrom x import y as z
from x import*;z=y
.
__import__
girintili bir bloğun içinde olacağından adlandırılmış bir işlevin içinde yardımcı olur. Bir içe aktarma, iki satırda ve girintili olduğundan fazladan ücretlendirilir. (Bu, işlevin dışında ithalata izin verilmediği varsayılmaktadır.)