Python:导入相互依赖的模块

Python:导入相互依赖的模块,python,dependencies,Python,Dependencies,我有两个文件rest\u api.py和Contact.py。Contact类似于域对象(包含Contact类),而rest\u api具有设置应用程序的功能 在rest\u api中,我有以下几行代码: from Contact import Contact ... client = MongoClient('localhost',27017) collection = client.crypto_database.test_collection def dbcollection(){

我有两个文件
rest\u api.py
Contact.py
。Contact类似于域对象(包含
Contact
类),而rest\u api具有设置应用程序的功能

rest\u api
中,我有以下几行代码:

from Contact import Contact
...
client = MongoClient('localhost',27017)
collection = client.crypto_database.test_collection
def dbcollection(){
     return collection
}
...
api.add_resource(Contact,'/contact/<string:contact_id>')
此操作失败,出现以下错误:
ImportError:无法导入姓名联系人

导入contact的正确方法是什么,以便它也可以使用rest_api中的变量/函数


p、 s如果我将集合代码移动到另一个文件,并导入该文件,则一切正常,但我假设还有其他方法。

这是一个循环导入依赖项,无法解决此问题。问题是,导入python模块确实会运行代码,代码必须遵循一定的顺序,其中一个模块必须先运行

我想说,将支持代码放在不同的文件中是正确的做法

但是,在这种情况下,导入时实际上不需要
dbcollection
。因此,您可以通过将导入从模块级删除到get函数中来解决此问题。比如说

class Contact(Resource):
    def get(self,contact_id):
        from rest_api import dbcollection
        result = {}
        result['data'] = dbcollection.find_one({'contact_id':contact_id})
        result['code'] = 200 if result['data'] else 404
        return make_response(dumps(result), result['code'],{"Content-type": "application/json"})
类似的方法如下:

from rest_api import dbcollection

class Contact(Resource):
    def get(self,contact_id):
        result = {}
        result['data'] = dbcollection.find_one({'contact_id':contact_id})
        result['code'] = 200 if result['data'] else 404
        return make_response(dumps(result), result['code'],{"Content-type": "application/json"})
import rest_api

class Contact(Resource):
    def get(self,contact_id):
        result = {}
        result['data'] = rest_api.dbcollection.find_one({'contact_id':contact_id})
        result['code'] = 200 if result['data'] else 404
        return make_response(dumps(result), result['code'],{"Content-type": "application/json"})

这应该是可行的,因为python做了一些努力来解决循环导入依赖关系:当它开始导入模块时,它会为该模块创建一个空的模块dict。然后,当它找到一个嵌套导入时,它将继续执行该导入。如果这又导入了一个已经在导入过程中的模块,那么它只会跳过它。因此,在加载
Contact.py
时,
import rest\u api
只获取已经存在的模块dict。因为它还不包含
dbcollection
,所以rest api导入dbcollection失败。然而,一个简单的
导入rest\u api
确实有效,因为它的成员只有在
Contact.py
完成导入后才会被寻址(除非您从内部在模块级别调用
Contact.get

假设您不知道哪些模块将导入哪些其他模块,您可以自己跟踪,而不必进行导入

在_uinit__u;.py中,定义这些--

然后,在每个类文件的顶部定义类,并将以下内容添加到此_module.py中:

from my_modules import requires_module, importing_module

importing('ThisModule')
if requires_module('ThatModule')
    from my_modules.that_module import ThatModule

class ThisModule:
    """ Real Stuff Goes Here """
    pass
from my_modules import requires_module, importing_module

importing('ThatModule')
if requires_module('ThisModule')
    from my_modules.this_module import ThisModule

class ThatModule:
    """ Real Stuff Goes Here """
    pass
这与_module.py有关:

from my_modules import requires_module, importing_module

importing('ThisModule')
if requires_module('ThatModule')
    from my_modules.that_module import ThatModule

class ThisModule:
    """ Real Stuff Goes Here """
    pass
from my_modules import requires_module, importing_module

importing('ThatModule')
if requires_module('ThisModule')
    from my_modules.this_module import ThisModule

class ThatModule:
    """ Real Stuff Goes Here """
    pass

现在,无论哪一个先导入,您都可以获得导入。

Hm。。我没有意识到这一点,但我不确定这是一个理想的方法。注意。