4

現在、Python チュートリアルを行っていますが、IDLE を使用しており、ターミナルでインタープリターを使用することにしました。そのため、作成したモジュールをインポートする方法を見つけなければなりませんでした。最初に私が試した

import my_file

次に、モジュール内の関数を単独で呼び出してみましたが、失敗しました。私は周りを見回してやった

my_file.function

動作します。インポートされた場合、なぜこれを行う必要があるのか​​ 非常に混乱しています。また、関数を呼び出すことができるようにする方法はありますか? 誰でも私を正しい方向に向けることができますか?前もって感謝します。

4

5 に答える 5

8

my_file.functionを呼び出すだけで使いたい場合は、キーワードfunctionを使用してみてください。from

import my_file試してみる代わりにfrom my_file import *

次のように、モジュールの一部のみをインポートするためにこれを行うこともできます。 from my_file import function1, function2, class1

名前の衝突を避けるために、別の名前でインポートできます。 from my_file import function as awesomePythonFunction

編集: これには注意してください。内部myfile, myfile2が同じ 2 つのモジュール ( ) をインポートすると、最後にインポートしたモジュールの を指します。これは、知らないと面白いことが起こる可能性があります。functionfunctionfunction

于 2012-04-26T21:15:14.427 に答える
5

これは python の中心的な概念です。名前空間を使用します ( の最後の行を参照import this)。何千人もの人々が多くの異なるモジュールを書いているため、名前の衝突の可能性はかなり高いという考えです。たとえば、私は function を提供するモジュールfooを書きbaz、Joe Smithは function をbar提供するモジュールを書きますbaz。Mybazは Joe Smiths と同じではないため、この 2 つを区別するために、それらを名前空間 ( fooand bar)に配置して、私のものを から呼び出しfoo.baz()、Joe のものを から呼び出すことができるようにしbar.baz()ます。

もちろん、必要なだけで、インポートされた他のモジュールが問題を引き起こさないと確信しているfoo.baz()場合、常に入力するのは面倒です...そのため、pythonは構文を提供するか、関数/オブジェクト/定数のみをインポートすることさえできます(他の人がすでに指摘しているように)。baz()from foo import *from foo import bazbaz

さらに複雑になる可能性があることに注意してください: 関数 bar と baz を提供するモジュール foo があると仮定します。以下は、foo 内に含まれる関数をインポートして呼び出すいくつかの方法です...

import foo                 # >>> foo.bar();foo.baz()
import foo as bar          # >>> bar.bar();bar.baz()
from foo import bar,baz    # >>> bar(); baz()  
from foo import *          # >>> bar(); baz()
from foo import bar as cow # >>> cow()  # This calls bar(), baz() is not available
...
于 2012-04-26T21:25:17.297 に答える
5

基本的なimportステートメントは、指定された名前へのモジュール オブジェクト (Python ではすべてがオブジェクト) の割り当てです。つまり、プログラムのimportどこでも変数に値を割り当てることができます。それらは同じものだからです。舞台裏では、Python は組み込み関数を呼び出し__import__()てインポートを実行し、結果を返し、それを指定した変数名に割り当てています。

import foo

「モジュールをインポートし、名前空間でfoo名前を割り当てることを意味します。これは次と同じです。foo

foo = __import__("foo")

同様に、次のことができます。

import foo as f

これは、「モジュールをインポートして、名前空間でfoo名前を割り当てる」ことを意味します。fこれは次と同じです。

f = __import__("foo")

この場合、モジュールオブジェクトへの参照しかないため、モジュールに含まれるものを参照するには属性アクセスが必要ですfoo.bar

することもできますfrom foo import bar。これにより、モジュール内の関数barを指す名前空間で名前が付けられた変数が作成されます。これは、次の構文シュガーです。barfoo

bar = __import__("foo").bar
于 2012-04-26T21:54:56.997 に答える
1

私はあなたの混乱を本当に理解していません。その下にあるものではなく、 name をインポートしたmy_fileので、それが参照方法です。

モジュール内に関数またはクラスを直接インポートする場合は、次を使用できます。

from my_file import function
于 2012-04-26T21:14:25.743 に答える
0

すでに投稿されたコメントの多くを組み込むつもりです。

functionmodule を参照せずに にアクセスするにmy_fileは、次のいずれかを実行できます。

from my_file import function

また

from my_file import *

モジュールがどのように機能するかについてのより詳細な説明については、python modulesのドキュメントを参照してください。

最初のソリューションが推奨されるソリューションであり、2 番目のソリューションは多くの理由から推奨されません。

  • 名前空間を汚染します
  • これは保守性にとっては良い方法ではありません (特定の名前がどこにあるかを見つけるのが難しくなります。
  • 通常、何がインポートされているか正確にはわかりません
  • pyflakes などのツールを使用して、コード内のエラーを静的に検出することはできません

Python インポートは、Python がモジュール内のステートメントを実行するという点で、C や Java などの静的言語の #includes/imports とは異なる動作をします。したがって、2 つのモジュールが特定の名前 (または *) を相互にインポートする必要がある場合、ImportError特定の名前をインポートするときや、単に期待される名前が定義されていないなど、循環参照の問題が発生する可能性があります (あなたの場合from ... import *) 。 . 特定の名前を要求しない場合、名前が実際に使用するまでに定義されている限り、循環参照のリスクに遭遇することはありません。

またfrom ... import *、すべてを取得することを保証するものではありません。__all__Python モジュールに関するドキュメントに記載されているように、モジュールは名前を定義し、from ... import *ステートメントが__all__.

于 2012-04-26T21:56:29.347 に答える