Python+;扭曲的。。。从不同的文件导入类?

Python+;扭曲的。。。从不同的文件导入类?,python,twisted,Python,Twisted,我们正在进行一个项目,并首次使用Twisted。虽然我们都是初学者,但我们知道基本上每个文件都有一个类+函数是一个很好的实践。在Twisted中,我们在文档中读到的内容表明,这实际上是不可能的,因为Twisted运行的实例不能超过一个 就好像twisted正在运行一样编写代码,然后在运行twisted的文件中运行所有函数等,这样可以吗 澄清: 假设我正在运行我的twisted in实例 main.py 我需要导入某些扭曲协议: from twisted.internet.protocol im

我们正在进行一个项目,并首次使用Twisted。虽然我们都是初学者,但我们知道基本上每个文件都有一个类+函数是一个很好的实践。在Twisted中,我们在文档中读到的内容表明,这实际上是不可能的,因为Twisted运行的实例不能超过一个

就好像twisted正在运行一样编写代码,然后在运行twisted的文件中运行所有函数等,这样可以吗

澄清:

假设我正在运行我的twisted in实例

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)
只要它与从twisted导入的文件在同一个文件中,所有这些都可以正常运行。因为,据我们所知,事情就是这样做的。例如,如果我要在一个文件中导入时间,然后生成另一个文件,那么我也必须在那里导入时间

我不知道LineReceiver的具体情况,但我们的印象是,您只能运行一个reactor实例,我们在整个程序中多次使用reactor(比如reactor.callLater)中的方法

然而,我们遇到的问题更多的是整洁。我们的程序很快增长到刚刚超过4000行,并且还在增长,当然这会导致在所有这些代码行中查找内容的大量时间消耗。所以我们想为每个类创建一个不同的文件。但由于每个文件中都没有运行twisted,因此我们不确定这是否有效


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

导入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
,它们都可以安全导入

我们知道,基本上每个文件都有一个类+函数是一种很好的做法

不,那太可怕了。你是从PHP来的,不是吗

因为不能有多个twisted运行实例

就好像twisted正在运行一样编写代码,然后在运行twisted的文件中运行所有函数等,这样可以吗

我不知道你在说什么

从您的示例中,我想您的问题在于您不了解python的作用域-每个模块(文件)都有一个作用域,因此如果您
import x
,则在编写导入的文件中可以使用x。如果您需要另一个文件中的
x
,您也需要将其导入到那里(或者通过函数调用将其传递到那里)


查看作用域和导入是如何工作的,以及模块和包之间的区别。

我相信我们已经用这种方式编码了,但我不知道在main()中导入它的后一部分会起作用。非常感谢!您可能让我们免于数小时的挫折。Mathieu所说的“twisted正在运行的实例不能超过一个”的意思是,只有一个reactor可以安装为
twisted.internet.reactor
,不幸的是,大量代码假定可以在该命名空间中找到正在运行的reactor;同样,许多路径处理库可以在python中共存,但只有一个可以安装在
os.path