为了账号安全,请及时绑定邮箱和手机立即绑定

ImportError:无法导入名称X

ImportError:无法导入名称X

海绵宝宝撒 2019-07-10 10:00:20
ImportError:无法导入名称X我有四个不同的文件名为:主,矢量,实体和物理。我不会发布所有的代码,仅仅是导入,因为我认为这就是错误所在。(如果你愿意,我可以张贴更多)主要:import timefrom entity import Entfrom vector import Vect#the rest just creates an entity and prints the result of movement实体:from vector import Vectfrom physics import Physicsclass Ent:     #holds vector information and iddef tick(self, dt):     #this is where physics changes the velocity and position vectors矢量:from math import *class Vect:     #holds i, j, k, and does vector math物理学:from entity import Entclass Physics:     #physics class gets an entity and does physics calculations on it.然后从main.py运行,得到以下错误:Traceback (most recent call last):File "main.py", line 2, in <module>     from entity import EntFile ".../entity.py", line 5, in <module>     from physics import PhysicsFile ".../physics.py", line 2, in <module>     from entity import EntImportError: cannot import name Ent我对Python非常陌生,但我使用C+已经很长时间了。我猜想,这个错误是由于两次导入实体造成的,一次在主,一次在物理中,但我不知道有什么解决办法。有人能帮忙吗?
查看完整描述

3 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

虽然您应该明确地避免循环依赖,但是可以推迟python中的导入。

例如:

import SomeModuledef someFunction(arg):
    from some.dependency import DependentClass

这(至少在某些情况下)可以避免错误。


查看完整回答
反对 回复 2019-07-10
?
青春有我

TA贡献1784条经验 获得超8个赞

这是一个循环依赖关系。它可以在不对代码进行任何结构修改的情况下得到解决。出现此问题是因为vector你要求entity可以立即使用,反之亦然。造成此问题的原因是,您要求在模块准备就绪之前访问该模块的内容-方法是使用from x import y..这与

import x
y = x.ydel x

Python能够检测循环依赖关系,并防止导入的无限循环。本质上,所发生的一切就是为模块创建一个空占位符(即。它没有任何内容)。编译循环相关模块后,它将更新导入的模块。就像这样。

a = module() # import a# rest of modulea.update_contents(real_a)

要使python能够处理循环依赖关系,必须使用import x只有风格。

import xclass cls:
    def __init__(self):
        self.y = x.y

由于不再在顶层引用模块的内容,python可以编译模块,而不必实际访问循环依赖项的内容。在顶层,我指的是编译期间将执行的行,而不是函数的内容(例如。y = x.y)。访问模块内容的静态或类变量也会导致问题。


查看完整回答
反对 回复 2019-07-10
  • 3 回答
  • 0 关注
  • 678 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信