我们正在开展一个项目并首次使用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的主文件中调用它们?
答案 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调用将它传递到那里)。
查看范围和导入的工作方式以及模块和包之间的差异。