25

私はPythonを学んでいて、まだ1年ほど勉強していますが、まだ初心者です。メインモジュール内で呼び出される関数のモジュールを作成しようとしています。呼び出されたモジュールの各関数を実行するには、数学モジュールが必要です。呼び出されたモジュール内に数学モジュールをインポートせずにこれを行う方法があるかどうか疑問に思っています。ここに私が持っているものがあります:

main.py:

from math import *
import module1

def wow():

    print pi


wow()
module1.cool()

module1.py:

def cool():

    print pi

実行すると、次のmain.pyようになります。

3.14159265359

Traceback (most recent call last):
  File "Z:\Python\main.py", line 10, in <module>
    module1.cool()
  File "Z:\Python\module1.py", line 3, in cool
    print pi
NameError: global name 'pi' is not defined

理解に苦労しているのは、実行時に名前エラーが発生する理由ですmain.py。変数にアクセスできるpiため、インポート時に変数がメインモジュールに対してグローバルになることを知っています。また、印刷して取得できるため、インポート時にメインモジュールに対してグローバルになるwowことも知っています。はメイン モジュールのグローバル名前空間内にあるため、プログラムは最初に変数の関数内を調べて、そこに見つからない場合はモジュール内の変数を調べて、そこで見つけるべきではありませんか?coolmodule1.cool<function cool at 0x02B11AF0>coolcoolpimainpi

私が知っているこれを回避する唯一の方法は、内部に数学モジュールをインポートすることですmodule1.py。私はその考えが好きではありません. 名前空間の把握に近づいているように感じますが、これについては助けが必要です。ありがとう。

4

5 に答える 5

6

「明示的は暗黙的よりも優れている」というのは、Python の作成者 (python を起動して を実行するimport this) によって下された設計上の決定です。

したがって、 を実行すると、Python はモジュール内module1.cool()の undefined を探しません。pimain


使用したいときはいつでも、明示的に math モジュールをインポートする必要があります - それが Python の仕組みです。

また、スタイルのインポートも避けるべきですfrom X import *。これも悪い習慣です。ここで、次のことができますfrom math import pi

于 2013-04-08T22:21:11.560 に答える
2

他の人が言ったように、実際にはグローバルはありませpimodule1。あなたにとって良い解決策はこれです。これはからpi一度だけインポートし、取得しているものがからのものであることmath明示的に保証しpiますmodule1:

main.py:

import module1

def wow():
    print module1.pi

wow()
module1.cool()

module1.py:

from math import pi

def cool():
    print pi
于 2013-04-08T22:33:25.463 に答える