3

ちょっとわかりにくいタイトルですが、質問は簡単です。

何かの を取得する必要があるプログラムがありますが、sqrt()から必要なのはそれだけですmath。モジュール全体をインポートして単一の関数を取得するのは少し無駄に思えます。

と言うことができますが、プログラムのメイン名前空間に追加されるのでfrom math import sqrt、それsqrt()は望ましくありません (特に、プログラムをモジュールとして使用できるように変更する予定があるため、そのようなインポートはその状況で問題を引き起こしますか?)。math.sqrt()構文を保持しながら、その 1 つの関数のみをインポートする方法はありますか?

この特定のケースでは Python 2.7 を使用していますが、Python 3 に別の答えがある場合は、将来の参考のためにそれも聞きたいです。

4

4 に答える 4

6

mathどちらの方法でも、コンパイルされて に保存されているという意味で完全なモジュールを「インポート」しますsys.modulesfrom math import sqrtしたがって、と比較しても、最適化のメリットはありませんimport math。彼らはまったく同じことをします。それらはmathモジュール全体をインポートして保存します。sys.modules唯一の違いは、最初のものはsqrt関数を名前空間に持ち込み、2 つ目はmathモジュールを名前空間に持ち込むことです。ただし、名前は単なる参照であるため、モジュールから何かをインポートするだけでは、メモリや CPU にメリットはありません。

math.sqrt構文が必要な場合は、import math. sqrt()構文が必要な場合は、を使用しますfrom math import sqrt

モジュールのユーザーがスターインポートを行った場合に名前空間を汚染することを懸念している場合は、モジュールのユーザーがインポートを開始した場合にインポートされるオブジェクトを表す文字列のリストである変数をモジュールにfrom your_module import *定義します。 __all__.

于 2013-08-18T14:35:45.603 に答える
1

から使用しmath import sqrtます。__all__ステートメントを使用して、モジュールからエクスポートする関数を保護できます。__all__モジュールからエクスポートしたい名前のリストでなければなりません。

于 2013-08-18T14:31:08.090 に答える
0

短い答えはノーです。するだけですfrom math import sqrt。スクリプトをモジュールとして使用しても問題は発生せず、コードが読みにくくなることもありません。

于 2013-08-18T14:30:58.933 に答える
0

いいえ、モジュールの仕組みにより、それは不可能です。何が問題なのimport mathですか?

検討:

module.py

x = 1

def foo():
    return x

x = 2

def bar():
    returnx

メイン (疑似コード):

import main but_only foo

print foo()

Python は、行に到達するまで foo 関数について知りませんdef foo。あなたが提案しているのは、モジュールからランダムに選択された行が実行されるということです。しかし、Pythonはどの行をどのように知ることができますか? この例では、どのような値がfoo()返されるでしょうか?

于 2013-08-18T14:31:30.900 に答える