0

私たちはプロジェクトに取り組んでいて、初めて Twisted を使用しています。私たちはどちらも初心者ですが、基本的にファイルごとに 1 つのクラスと関数を使用するのが一般的に良い方法であることを知っています。Twisted では、ツイスト実行のインスタンスを複数持つことはできないため、これを行うことは実際には不可能であることがドキュメントで読み取られました。

ツイストが実行されているかのようにコードを記述してから、ツイストを実行しているファイルですべての関数などを実行しても問題ありませんか?

明確にするために:

ツイストインのインスタンスを実行しているとします

main.py

特定のねじれたプロトコルをインポートする必要があります。

from twisted.internet.protocol import Factory
from twisted.protocols.basic import LineReceiver
from twisted.internet import reactor
from twisted.internet import task
import random
import sqlite3
import string

そして、twisted からインポートしたものからいくつかの関数を使用するクラス (ただし、今は関数とだけ言っておこう) を作成します。たとえば、LineReceiver にはメソッド sendLine があります。

def connectionLost(self, leave):
....
        if self.users.has_key(self.name):
        message = "%s has disconnected" % (self.name)
        del self.users[self.name]
        print (message)
        for name, protocol in self.users.iteritems():
            protocol.sendLine(message)

ツイストからのインポートと同じファイルにある限り、これはすべて問題なく実行されます。なぜなら、私たちが知っていることから、それが物事がどのように行われるかです. たとえば、あるファイルに時間をインポートしてから別のファイルを作成する場合、そこでも時間をインポートする必要があります。

具体的には LineReceiver についてはわかりませんが、reactor の 1 つのインスタンスしか実行できないという印象を受けています。このインスタンスからのメソッド (reactor.callLater など) をプログラム全体で何度も使用しています。

ただし、私たちが遭遇する問題は、整頓の問題です。私たちのプログラムはすぐに 4,000 行を超え、さらに増え続けています。もちろん、これにより、これらすべてのコード行内で何かを探すのに多くの時間が費やされます。なので、基本的にはクラスごとに別のファイルを作りたいと思っています。しかし、各ファイルで twisted が実行されていないため、これが機能するかどうかはわかりません。

または、 sendLine などのメソッドを実行して、各クラスを独自のファイルにコピー/貼り付けてから、ツイストが実行されているメインファイルでそれらをインポート/呼び出すことができますか?

4

2 に答える 2

1

メソッドを直接インポートtwisted.internet.reactorして呼び出すことは、多くの場合、問題の兆候です。呼び出し元は、呼び出し先が何をしているかを制御できなくなり、コードのテストを作成するのが非常に難しくなります。

代わりに、reactor をパラメーターまたは属性として使用するために必要なすべてをリファクタリングする必要があります。つまり、次のようになります。

class Foo(object):
    def __init__(self, reactor, ....):
        self.reactor = reactor

そして、twisted.internet.reactorできるだけ遅く、1 か所だけにインポートします。

def main():
    do_some_stuff()
    from twisted.internet import reactor
    stuff_done = start_some_stuff(reactor)
    stuff_done.addCallback(reactor.stop)

if __name__ == '__main__':
    main()

以外はtwisted.internet.reactor、必要な場所にすべてをインポートしてもまったく問題ありません。2 つのモジュールが必要な場合LineReceiverは、両方とも安全にインポートできます。

于 2013-09-19T20:38:13.393 に答える
0

ファイルごとに基本的に 1 つのクラス + 関数を使用するのが一般的に良い方法であることはわかっています。

いいえ、それは恐ろしいです。あなたはPHPから来ていますよね?

ねじれた実行のインスタンスを複数持つことはできないためです。

ツイストが実行されているかのようにコードを記述してから、ツイストを実行しているファイルですべての関数などを実行しても問題ありませんか?

私はあなたが何について話しているのか分かりません。

あなたの例から、あなたの問題はあなたがpythonスコープを理解していないことだと思います-モジュール(ファイル)ごとにスコープがあるのでimport x、インポートが書き込まれたファイルでxが利用可能です。x他のファイルが必要な場合は、そこにもインポートする必要があります(または関数呼び出しでそこに渡します)。

スコープとインポートがどのように機能するか、およびモジュールとパッケージの違いを調べてください。

于 2013-09-19T20:45:35.237 に答える