Python Import ile Golf


16

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:


11

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

@AlexA İthalleri adlandırılmış bir işlevin dışına yerleştirirken sorun görmüyorum.
feersum

O zaman importgirintili bir bloğun içine çağrılacak bir zaman olur muydu? Muhtemelen değil.
Alex

içe aktarılanları belirtilen işlevin dışına yerleştirmek, yalnızca bir işlev yazdığınız zorluklar için işe yaramaz.
Sparr

6
İkinci örnek gerektirmez f=, çünkü anonim fonksiyonlar izin verilir ve içerik dışında fonksiyonu olabilir .
xnor

4

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

Misal:

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

1

Neredeyse hiç.

__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 zağ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.


1
Matematiğinizi kontrol edebilir misiniz? Bundan __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 timeve random.
xnor

@xnor İki kez yeni satır saymadım, ancak bu sürümdeki noktaya ihtiyacınız olmadığını kaçırdım. Bana bir dakika ver, güncelleyeceğim.
L3viathan

1
z=__import__("x").ybir bayt daha kısafrom x import y as z
negatif yedi

1
@negativeseven Shorter: from x import*;z=y.
L3viathan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.