Skip to main content
 首页 » 编程设计

python之相互依赖的模块

2025年05月04日13java哥

我有一个 bind_form 自定义装饰器,它将指定的 django 表单分配给一个函数。此装饰器将允许对函数参数“自动”执行验证 - 例如,检查 age 是否在要求的范围内,或检查用户是否存在。这样做是出于 DRY 原因。

装饰器中引用的每个表单都存在于 forms 模块中。

此表单验证的示例可以是 users.check_user_exists - 因此我必须在 form 模块中导入 users 模块。

所以,现在您看到我有 forms 模块,它导入了 users 模块,因此可以引用 users.user_exists,但是 users 导入 forms 模块,因此可以在表单装饰器中使用表单:

表单.py:

import users 
 
def bind_form(func): 
    # binds form to function 
    ... 
 
class Create_User(Forms.Form): 
    # validated create_user function 
    ... 
    def clean(self): #using for validation 
        if users.user_exists(user): 
           ... 

用户.py:

import forms 
 
@forms.bind_form(form=forms.Create_User) 
def create_user(**kwargs): 
    ... 

所以一旦 users 被导入,users 就会尝试引用 bind_form,但这还没有被 表单。

这是我的设计缺陷,还是我遗漏了一些简单的东西?如有设计缺陷-欢迎提出改进建议。

** 约束条件:**

  • forms 模块中有很多表单。
  • users 模块中的许多函数都附有验证表单。
  • 验证表单使用了来自users 和其他模块的许多功能。

换种方式解释:

一个。 forms 在 forms 模块的第 4 行导入 users

users.create_user 引用 forms.Create_User

forms 还不知道 Create_User 因为它是在 forms 模块的第 5 行声明的

请您参考如下方法:

循环依赖的诀窍是在全局范围内分隔语句,这样所有不引用从其他模块导入的任何符号的语句都在您导入它之前发生。例如……

表单.py:

# This statement doesn't reference 'users' at compile time 
def bind_form(func): 
    ... 
 
# This statement doesn't reference 'users' at compile time 
class Create_User(Forms.Form): 
 
    # This statement declares a new scope 
    def clean(self): 
 
        # This statement references 'users' at runtime, but not at compile time 
        if users.user_exists(user): 
            ... 
 
# Now import 
import users 

用户.py:

# Import 
import forms 
 
# This statement references 'forms' at compile time 
@forms.bind_form(form=forms.Create_User) 
def create_user(**kwargs): 
    ... 

Create_User.clean()方法中users符号的使用不在全局范围内,所以实际上不需要定义符号直到函数被实际调用为止。