0

我们正在开发一个项目并首次使用 Twisted。虽然我们都是初学者,但我们知道每个文件基本上只有一个类 + 函数通常是一种很好的做法。在 Twisted 中,我们在文档中读到的内容表明,这样做实际上是不可能的,因为您不能拥有多个扭曲运行的实例。

是否可以只编写您的代码,就好像twisted 正在运行一样,然后在运行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.callLater)的方法。

然而,我们遇到的问题更多的是整洁。我们的程序很快就增长到刚刚超过 4,000 行标记并且还在增长,当然这会导致在所有这些代码行中寻找东西的大量时间。所以我们想基本上为每个类制作一个不同的文件。但是我们不确定这是否会起作用,因为每个文件中都没有运行扭曲。

或者是否可以简单地将每个类复制/粘贴到自己的文件中,运行 sendLine 等方法,然后在运行 twisted 的主文件中导入/调用它们?

4

2 回答 2

1

直接在其上导入twisted.internet.reactor和调用方法通常是麻烦的迹象。你的调用者将失去对你的调用者正在做什么的控制,这使得为你的代码编写测试变得更加困难。

相反,您应该重构需要使用反应器将其作为参数或属性的所有内容,即:

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

twisted.internet.reactor然后,尽可能晚地只在一个地方导入:

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,在你需要的地方导入所有东西都很好,如果两个模块需要LineReceiver,它们都可以安全地导入它。

于 2013-09-19T20:38:13.393 回答
0

我们知道每个文件基本上只有一个类+函数通常是一种好习惯。

不,那太可怕了。你来自 PHP,不是吗?

因为你不能有超过一个扭曲运行的实例。

是否可以只编写您的代码,就好像twisted 正在运行一样,然后在运行twisted 的文件中运行您的所有功能等?

我不知道你在说什么。

从您的示例中,我猜您的问题是您不了解 python 范围 - 每个模块(文件)都有一个范围,因此如果您import x, x 在写入导入的文件中可用。如果您需要x在其他文件中,您也需要在那里导入它(或通过函数调用将它传递到那里)。

查看作用域和导入的工作方式以及模块和包之间的区别。

于 2013-09-19T20:45:35.237 回答