2011-01-16 8 views
0

Greetings! 私は単純なスネークゲームを作っています。私はクラスe.iを別のモジュールで展開したい。私のメインゲームループとは別のスクリプトでメニュークラスを持っています。言い換えれば、インポートしたスクリプトが、メインスクリプトで先に呼び出されたpygame initを取得するようにしたいのです。ここでインポートしたスクリプトからPygameモジュールを使用する

は私の問題の擬似コードを使用して簡単な例です:main.pyで

one.py

def version(): 
    print pygame.version 

私はpygameのを輸入していると()pygame.initんでした。ここから、私もデフバージョンを(使用したい)

one.py main.py

import pygame 
import one 

pygame.init() 

one.version() 

からしかし、それは私なしpygameの定義されたエラーが発生します。私はそれが私にエラーを与える理由を知っているなぜなら、one.pyがmain.py内から呼び出されたとき、それはmain.pyからの宣言を保持しないからです。

私が知りたいのは、上記のことを実践する方法です。

ありがとうございました!

答えて

3

モジュールXをインポートするモジュールのインポートは、Xのネームスペースに漏れません(これは良いスコープまたはC/C++スタイルの#includeが必要です)。有害な)。これは完全に別の名前空間です。モジュールに何か(例:pygame)(例:one)を使用する場合は、そこにインポートします。

+0

私はそれを考えました。それは効率的ですか?私がその道を行くなら、私は必要に応じて各モジュールにPygameをインポートしなければならないでしょう。もし呼び出されたときにPygameをインポートする関数を持った別のモジュールを作成したのでしょうか? – user577317

+0

@ user577317:はい、効率的です。別のモジュールを作成するのは意味がありません。その代わりにインポートする必要があるからです。 –

+1

@ user577317:発信者の名前空間を操作することはできません(おそらく可能ですが、信頼性の低いハッキングであり、かなりの労力を要しますし、まずは悪い考えです)。 **ちょうどそれらをインポートする**、神のために。この質問は、理解していない最適化が無意味で有害である理由のもう一つの例です)すでにインポートされているモジュールをインポートする(現在実行されているインタプリタプロセスでは、通常は1つのプログラムしか持たない)既にインポートされたモジュール私。非効率ではありません。 – delnan

1

Pythonの輸入モデルは以下の通りです:あなたは、あなたのモジュールd.e.fモジュールa.b.cが必要な場合は、追加import a.b.c(または類似)d/e/f.pyの先頭に。これは、多くのモジュール(たとえばa.b.c1a.b.c2、...)を必要とする多くのモジュール(たとえばd.e.f1d.e.f2、...)がある場合は、必要なモジュールをそれぞれからインポートする必要があります各モジュールは、モジュールソースファイルに同じimportステートメントの複数のコピーを作成します。コンパクトなインポートモデル(同じモジュールを一度だけインポートする必要がある)はより良いでしょうが、それは非常に重要な欠点があります。コンパクトなインポートモデルはグローバル名前空間を使用し、誰がこのコードを必要としますか?、このコードはどこから来たのですか?)はるかに難しいです。したがって、必要ではないと思われるインポート行を書くたびに、これは保守可能なコードに対して支払っている(小さな)価格であることに注意してください。

+0

うーん...面白いです。アドバイスをありがとう、私はそれを念頭に置くよ。 – user577317

関連する問題