回答:
これは、匿名ラムダ関数でモジュールを1回だけ使用する場合に便利です。別のステートメントを記述する必要がないためです。
lambda x:__import__('SomeModule').foo(x,123)
より1バイト短い
from SomeModule import*;f=lambda x:foo(x,123)
コードが名前の付いた関数またはプログラムである場合__import__
、最も極端なまたは不自然な状況を除いて、役立つことはまずありません。
import
、インデントされたブロック内で呼び出される時間がありますか?おそらくない。
十分に長い名前の複数のモジュールをインポートする場合、__import__
関数を短い変数に割り当ててインポートに使用すると役立つ場合があります
通常のインポート文-97バイト
itertools import *から 日時インポートから* リストの印刷(permutations( "abc")) datetime.now()を出力します
-94バイト__import__
への割り当てi
:
i = __ import__ print list(i( "itertools")。permutations( "abc")) print i( "datetime")。datetime.now()
__import__("x").doSomething()
長さの名前を持つモジュールを参照するには、15 + x文字が必要です xのです。
import x\nx.doSomething()
9 + 2 * x文字が必要です。これらの関数はx = 6でオーバーラップするため、この方法と比較して、長い名前のモジュールを使用する方が良い__import__
。
ただし、from x import*\ndoSomething()
必要なのは14+ x文字なので、通常のインポートと比較して、モジュール名が5文字より長くない限り、それは価値がありません。
これはすべて、関数/クラス/何でも一度だけ参照していることを前提としています。複数回参照すると、式が変更され、後者のバージョンが勝者になる可能性があります。インポートしたモジュールから長いものを数回使用する場合、さらに別のバージョンが勝ちます:
from x import y as z
ネットを使用して、18 + x + y + z *(n +1)文字をzのn回使用します。これは、zを1にすることができるため、yが大きい場合は大幅に改善されます。
__import__("x").doSomething()
1文字より短いことがわかりましたfrom x import*;doSomething()
。たぶん、あなたは改行を2文字として数えていますか?そして、損益分岐点が5で、time
との間にあることを思い出しrandom
ます。
z=__import__("x").y
バイトより短いfrom x import y as z
from x import*;z=y
。
__import__
インデントされたブロックの内部にあるため、名前付き関数の内部に役立ちます。インポートは2行でインデントされているため、追加料金がかかります。(これは、関数の外部でインポートが許可されていないことを前提としています。)