如何避免验证模块中的循环依赖

时间:2014-04-11 22:36:35

标签: python validation anti-patterns

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

某事告诉我,我只是随意地重构了反模式。如果我正在尝试做的事情意味着循环依赖,那么我一定是做错了。

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

2 个答案:

答案 0 :(得分:1)

我认为特定于其中一个类的验证代码部分可能应该放入类本身 - 也许作为类方法?通过这种方式,'泛型'验证码只能在适当的时候调用obj.validate()。然后,您不需要从通用验证代码中导入类。

答案 1 :(得分:1)

尽管Tom Dalton的答案在最佳设计方面可能是正确的,但值得注意的是导入循环在Python中通常可以正常工作。

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

如果您使用from my_module import obj或类似内容,通常会遇到麻烦,因为只有在其他模块中已定义obj时才会有效。如果该其他模块正在导入您的模块,则可能尚未发生类定义或全局变量赋值。

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