Python无法导入名称

时间:2014-12-29 18:52:38

标签: python python-2.7

我似乎无法弄清楚如何将两个类相互导入。在运行应用程序时,它只是说

  from room import Room
ImportError: cannot import name Room

这可能是一个设计问题,但我认为没有其他方法可以引用这两个类,所以这需要保持原样。需要导入的唯一原因是因为对象中的redisco模块需要它们(它们需要知道类型)

#Room class.

class Room(models.Model):
    from player import Player
    players = models.ListField(Player, required = True)

#Player class
class Player(models.Model):
    from room import Room
    room = models.ReferenceField(Room, required = True)

如何让它发挥作用?

E:

框架是Redisco(Redis)

4 个答案:

答案 0 :(得分:2)

大多数ORM模型支持反向引用(其中引用字段的目标模型被赋予指向引用对象的额外属性),和/或允许您通过其他方式指定关系。

Redisco没有我可以发现的反向引用,但 支持字符串引用。如果传入字符串,它将被解释为模型名称,与__name__属性匹配:

class Room(models.Model):
    players = models.ListField('Player', required = True)

这完全绕过了导入问题。

来自ListField docstring

  

target_type - 可以是Python对象或redisco模型类。

     

如果target_type不是redisco模型类,则target_type应该是       也是一个可以将list元素的(字符串)值转换为的callable       TARGET_TYPE。例如。 str,unicode,int,float。

     

ListField还接受引用redisco模型的字符串。

code to resolve the name使用函数get_model_from_key()来解析字符串,该字符串只搜索models.Model的所有子类,在__name__上匹配。

在验证新值或第一次检索现有值时,它将解析名称,此时Player子类已被导入。

答案 1 :(得分:1)

如果它们在同一个.py文件中,那么您不需要导入。如果它们位于同一目录中的不同文件中,则只需使用“导入室”(假设它位于名为“room.py”的文件中)。如果它们位于不同目录中的单独文件中,则需要使用imp模块。

import imp
roomClass = imp.load_source('roomClass', [Path to room.py])

然后可以通过以下方式调用它:

aRoom = roomClass.Room(Model)

答案 2 :(得分:0)

  

首先,如果要将模块导入程序,它们必须位于同一目录中。

按照此操作导入模块;

from filename import classname
  

您要导入类

filename = your .py文件      

class 是您要使用的特定类。

from filename import *
  

将添加所有函数和类。

     

同时检查此主题。 program is running fine but cannot being import with IndexError

答案 3 :(得分:-1)

您可以参考此问题。

Pythonic way to resolve circular import statements?

使用import而不是from [...] import [...]