82

と の 2 つのファイルがnode.pyあり、それぞれとのpath.py2 つのクラスを定義しています。NodePath

今日までの定義はオブジェクトをPath参照していたので、私はそうしていましたNode

from node.py import *

path.pyファイルで。

ただし、今日の時点で、オブジェクトNodeを参照するための新しいメソッドを作成しました。Path

をインポートしようとしたときに問題が発生しましたpath.py: 試してみたところ、プログラムが実行され、Pathを使用するメソッドが呼び出されたときに、定義されていないNodeという例外が発生しました。Node

私は何をしますか?

4

5 に答える 5

121

Importing Python Modulesは、Python での循環インポートについて説明しているすばらしい記事です。

これを修正する最も簡単な方法は、パスのインポートをノード モジュールの最後に移動することです。

于 2009-05-21T20:11:55.547 に答える
30

もう 1 つのアプローチは、2 つのモジュールの一方を、もう一方のモジュールで必要な関数にのみインポートすることです。確かに、これは 1 つまたは少数の関数でのみ必要な場合に最適です。

# in node.py 
from path import Path
class Node 
    ...

# in path.py
class Path
  def method_needs_node(): 
    from node import Node
    n = Node()
    ...
于 2016-06-14T13:05:35.567 に答える
5

相互に利用するためにインポートする必要はないかもしれませPathん。node.pyPathNode

# in __init__.py  (The order of imports should not matter.)
from .node import Node
from .path import Path

# in path.py 
from . import Node
class Path
  ...

  def return_something_pathy(self): 
    ...

# in node.py
class Node
  def __init__(self, path): 
    self.path = path
    ...

  def a_node_method():
    print(self.path.return_something_pathy())

Nodeが を利用していることを明確にするためにPath、型ヒントを追加します。PEP 563で説明されている型注釈で前方参照をサポートするために、Python 3.7 以降で利用可能な機能があります。

# in node.py  (Now with type hinting.)
from __future__ import annotations

class Node
  def __init__(self, path: Path): 
    self.path = path
    ...

  def a_node_method():
    print(self.path.return_something_pathy())

Python の円形のインポート ホールからあなたを掘り出すためのさらに別のソリューションは、これを教えてくれた素晴らしいブログ投稿です。

于 2019-11-04T04:46:54.707 に答える