我该如何处理Google App Engine中的循环导入?

Ste*_*gle 9 python google-app-engine

如果我有"a.py"

from google.appengine.ext import db
class A(db.Model):
    db.ReferenceProperty(b.B)
    ...other stuff
Run Code Online (Sandbox Code Playgroud)

和另一个文件"b.py"

from google.appengine.ext import db
class B(db.Model):
    db.ReferenceProperty(a.A)
    ...other stuff
Run Code Online (Sandbox Code Playgroud)

看起来Python根本不允许循环依赖.通常我猜你会改变代码,这样两个类实际上可以解决自己而不直接相互导入.也许通过第三中间人来巩固他们对彼此的引用?但我不能只使用普通的中间类,因为所有类最终都需要持久保存到数据库中?是否有任何正确的解决方案来构造上述代码,使其有效?

我有一种感觉,我会得到很多"糟糕的代码","解耦","糟糕的设计"等评论.所以我想问一下,如果你这么说,请说明你用一个实际的例子做什么.有没有任何解决方案可以让参考,类和模块保持原样?

谢谢.

Woo*_*ble 7

解决方法是在至少一个不限制特定类的模型中使用ReferenceProperty,然后强制仅在您自己的代码中引用该类.

例如,

class A(db.Model):
  b = db.ReferenceProperty()

class B(db.Model):
  a = db.ReferenceProperty(A)
Run Code Online (Sandbox Code Playgroud)

您将能够将任何模型实例分配给b变量; 只是确保你只分配实际的Bs.

  • 这就是我所做的.它有点蹩脚,我的意思是我希望可能重新打开其中一个类,然后在它们被实例化之后"注入"一个引用属性,但无论如何.我想这是正确的答案,除非我看到更好的东西. (2认同)