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。。我没有意识到这一点,但我不确定这是一个理想的方法。注意。