Python Importを使用したゴルフ


16

Pythonでインラインのシングルユースインポートを使用するのが有益な場合

例えば:

__import__("x").doSomething()

上記は下よりも短くなっていますか?

import x
x.doSomething()

または

from x import*
doSomething()

回答:


11

これは、匿名ラムダ関数でモジュールを1回だけ使用する場合に便利です。別のステートメントを記述する必要がないためです。

lambda x:__import__('SomeModule').foo(x,123)

より1バイト短い

from SomeModule import*;f=lambda x:foo(x,123)

コードが名前の付いた関数またはプログラムである場合__import__、最も極端なまたは不自然な状況を除いて、役立つことはまずありません。


__import__インデントされたブロックの内部にあるため、名前付き関数の内部に役立ちます。インポートは2行でインデントされているため、追加料金がかかります。(これは、関数の外部でインポートが許可されていないことを前提としています。)
Alex A.

@AlexA名前付き関数の外部にインポートを配置しても問題はありません。
feersum

次にimport、インデントされたブロック内で呼び出される時間がありますか?おそらくない。
アレックスA.

名前付き関数の外部にインポートを配置することは、1つの関数のみを記述しているチャレンジでは機能しません。
スパー

6
2番目の例ではf=匿名関数が許可されており、関数の外部にコンテンツを含めることができるため、を必要としません。
xnor

4

十分に長い名前の複数のモジュールをインポートする場合、__import__関数を短い変数に割り当ててインポートに使用すると役立つ場合があります

例:

通常のインポート文-97バイト

itertools import *から
日時インポートから*
リストの印刷(permutations( "abc"))
datetime.now()を出力します

-94バイト__import__への割り当てi

i = __ import__
print list(i( "itertools")。permutations( "abc"))
print i( "datetime")。datetime.now()

1

ほとんどは決してない。

__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が大きい場合は大幅に改善されます。


1
数学を確認できますか?私は__import__("x").doSomething()1文字より短いことがわかりましたfrom x import*;doSomething()。たぶん、あなたは改行を2文字として数えていますか?そして、損益分岐点が5で、timeとの間にあることを思い出しrandomます。
xnor

@xnor改行を2回カウントしませんでしたが、そのバージョンではドットが必要ないことを逃しました。ちょっと待って、更新します。
L3viathan

1
z=__import__("x").yバイトより短いfrom x import y as z
負の7

1
@negativeseven短縮:from x import*;z=y
L3viathan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.