2

--fortanの回答後に編集----

ここからhttps://github.com/jdavisp3/twisted-intro/blob/master/twisted-client-3/get-poetry.py

リアクターは

def get_poetry(host, port, callback):
  ...
  from twisted.internet import reactor

メイン関数と同様に。

そして立ち寄った

def poetry_main():
  ...
  def got_poem(poem):
        poems.append(poem)
        if len(poems) == len(addresses):
            reactor.stop()

では、両方のリアクターが同じリアクターを指しているのでしょうか? 同じものの複数のインポートはどのように機能しますか?

また、定義しないのはなぜですか

from twisted.internet import reactor

使用する直前の関数内ではなく、プログラムの上部に?

4

2 に答える 2

2

twisted.internet.reactorモジュール レベルでインポートされない場合がある理由は、特定のリアクタ実装がまだ明示的に選択されていない場合、最初にインポートされるときにデフォルトの選択が行われるためです。実装が選択されると、変更することはできません。

モジュールtwisted.internet.reactorが最上位でインポートされる場合、インポートされるとすぐにリアクターがインポートされます。twisted.internet.reactorこれにより、トップ レベルでインポートするモジュールをインポートする前に選択する必要があるため、異なるリアクターの実装を選択することがやや難しくなります。

したがって、1 つの規則は、twisted.internet.reactorそれを使用する必要がある内部関数のみをインポートすることです。これは、関数が呼び出されるまでインポートが行われないことを意味します。これは通常、実装が既に選択されているほど遅いです。

もう 1 つの規則 (私を含む一部の人々が好む) は、リアクターを引数として受け入れる API を定義することです。この方法では、reactor をまったくインポートせず、関数が必要とする他の入力と共に渡されます。

このアプローチの大きな利点の 1 つは、コードの単体テストが容易になることです。

于 2013-04-29T12:21:20.067 に答える
0

よく見ると、別from twisted.internet import reactorpoetry_main機能があります。インポートのスコープは、変数や関数と同様に語彙的です。

そうする理由については、モジュールのグローバル名前空間を汚染しないことが考えられます。

Python は、インポートされたモジュールの内部辞書を保持しているため、モジュールが何回import編集されても、一度だけロードされ、その内部状態はすべての参照間で共有されます。

これは、循環的なモジュールの依存関係を許可するために重要です。そうしないと、無限再帰で終了します。

于 2013-04-29T09:57:48.640 に答える