【问题标题】:How to avoid circular dependencies in validation module如何避免验证模块中的循环依赖
【发布时间】:2014-04-11 22:36:34
【问题描述】:

我最近重构了我的代码,将在多个类之间共享的输入验证方法放在它们自己的模块validate.py 中。其中一些验证方法会检查它们的输入是否是类的实例,例如 MyClass。因此validate.py 必须导入MyClass 所以它的方法is_MyClass 可以检查isinstance(input, MyClass) 是否。但是,我想使用MyClass 中的validate.py 中的一些验证方法来清理MyClass.my_method 的输入,所以MyClass 必须导入validate.py

有件事告诉我,我只是随便将自己的方式重构为反模式。如果我正在尝试做的事情意味着循环依赖,那么我一定是做错了™。

但是,代码重用是个好主意。那么以这种方式共享验证方法的最佳做法是什么?

【问题讨论】:

    标签: python validation anti-patterns


    【解决方案1】:

    我认为特定于某个类的验证代码部分可能应该放入类本身 - 也许作为类方法?这样,“通用”验证代码就可以在适当的时候调用 obj.validate()。然后,您不需要从通用验证代码中导入类。

    【讨论】:

    • 是的,我就是这么想的。认为可能有一些超级pythonic很酷的方式来做到这一点。谢谢!
    【解决方案2】:

    虽然就最佳设计而言,Tom Dalton 的回答可能是正确的,但值得注意的是,导入周期通常在 Python 中运行良好。

    但限制是您需要使用import my_module 语法并避免使用导入模块的顶级(全局)代码。声明使用导入模块的函数(或带有方法的类)很好。

    如果你使用from my_module import obj 或类似的东西,你通常会遇到麻烦,因为这只有在obj 已经在另一个模块中定义时才有效。如果其他模块正在导入您的模块,则类定义或全局变量分配可能尚未发生。

    因此,对于您的具体情况,另一种解决方案可能是让您的validate 模块使用import my_class,然后is_MyClass 可以使用isinstance(input, my_class.MyClass)

    【讨论】:

      猜你喜欢
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 2013-04-02
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多