2017-07-17 11 views
0

私はPythonを初めて使いました。この質問を書くのに適切な言語を使用していないと謝ります。私はWindowsマシン上でPython 3.6.1を使用しています。私は問題の実例を提供しています。依存クラスを持つモジュールをロードする

ファイルDemo_func.pyに保存されたモジュールを書き込むとします。私はのように私のスクリプト内の関数chebyshev_nodesを書く代わりに、場合

NameError: name 'Chebyshev' is not defined

:それは、このエラーが発生し

from numpy.polynomial.chebyshev import Chebyshev 
from Demo_func import chebyshev_nodes 

chebyshev_nodes(5, [1,5]) 

def chebyshev_nodes(degree, domain): 
    return Chebyshev.basis(degree,domain).roots() 

は、私は次のスクリプトを実行します。これは、次の機能が含まれています以下、それはうまく動作します。

from numpy.polynomial.chebyshev import Chebyshev 
def chebyshev_nodes(degree, domain): 
    return Chebyshev.basis(degree,domain).roots() 

chebyshev_nodes(5, [1,5]) 

私の理解は、チェビシェフをグローバルにインポートすることです。しかし、どういうわけか、それは私のモジュールDemo_func内で動作します。 Chebyshevクラスに依存するモジュールを作成するにはどうすればよいですか?

+1

「Chebyshevをインポートすることはグローバルである」と私は理解しています。モジュールの初期化はグローバルで実行されますが、インポートを実行したスコープで使用できるのはChebyshev名だけです。 – user2357112

+0

ありがとう、それは役に立ちました。関数定義内でChebyshevをインポートすると動作します。それはこれを行う正しい方法ですか? –

答えて

-1

上記のコメントでuser2357112が指摘しているように、モジュールはグローバルに初期化されていますが、名前はそうではありません。この解決策は、ChebyshezクラスをDemo_func.pyファイルの関数にロードすることです。

def chebyshev_nodes(degree, domain): 
    from numpy.polynomial.chebyshev import Chebyshev 
    return Chebyshev.basis(degree,domain).roots() 
+0

申し訳ありませんが、これは間違った答えです。それが機能する間に、Chebyshevを関数本体の中にインポートする理由はありません。それはモジュール 'Demo_func'のスコープ内にインポートすることができます。この例では、循環インポートの問題はないので、関数本体のimportなどの回避策ではコードを難読化するだけです。循環的な輸入は、とにかくプロジェクトレイアウトがうまく設計されていないことを示しています。私を間違えないでください。私は評判を得るために別の答えを出すつもりはない。インポートする必要がある場所に置いてください(あなたが知っているので)、-1を-1に変更します。 – ElmoVanKielmo

+1

ありがとうございます。私は答えのタグを削除しました。私はバーチャル評判については何もしません。私は物事を元に戻すことを嫌うので、私は応答を提供しました。 私はまだクラス、スコープ、ネームスペースを、ほとんど試行錯誤で学習する過程にあります。私はあなたのコメントから 'Demo_func.py'ファイルの先頭に' Chebyshev'をインポートできることを理解しています。それは動作し、これはあなたが言うようにきれいです。これまでに試してみましたが、カーネルを再起動しなかったので動作しなかったと思います。学んだ教訓。 –

関連する問題