python - 相互依赖的模块

标签 python django django-forms decorator python-decorators

我有一个 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 和其他模块的许多功能。

换种方式解释:

一个。 formsforms 模块的第 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符号的使用不在全局范围内,所以实际上不需要定义符号直到函数被实际调用为止。

关于python - 相互依赖的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16001739/

相关文章:

python - 在 DefaultUserCreationForm 的模板中显示错误消息 - django

python - rpyc.Service 需要 10 秒来接收 150kB 的对象(在本地主机上,没有 LAN 问题)

python - 使用 .find 在列表中搜索字符串

Django Admin 在编辑时将 extra 设置为 0

python - 类型错误 : ‘DoesNotExist’ object is not callable

python - Django 表单发布未获取 request.GET 中的值

python 解析字符串以获取模式字符串

python - Pandas DataFrame 切片与副本 : which one is more memory friendly?

python - django 中的自定义订单

python - 如何获取UpdateView中当前的对象?