Python + Twisted ......从不同的文件导入类?

时间:2013-09-19 20:01:52

标签: python 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的主文件中调用它们?

2 个答案:

答案 0 :(得分:1)

导入twisted.internet.reactor并直接调用方法通常是一个麻烦的迹象。你的调用者将无法控制你的被调用者正在做什么,这使得为你的代码编写测试更加困难。

相反,您应该重构需要使用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,它们都可以安全地导入它。

答案 1 :(得分:0)

  

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

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

  

因为你不能有多个扭曲运行的实例。

     

是否可以将代码编写为正好运行,然后在正在运行的文件中运行所有功能等等?

我不知道你在说什么。

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

查看范围和导入的工作方式以及模块和包之间的差异。