相互依赖的模块

时间:2013-04-14 17:03:06

标签: python django django-forms decorator python-decorators

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

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

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

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

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):
           ...

users.py:

import forms

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

导入users后,users会尝试引用bind_form,但forms尚未“看到”。

这是我的设计缺陷,还是我错过了一些简单的东西?如果设计缺陷 - 建议欢迎改进。

**约束:**

  • forms模块中有许多表单。
  • users模块中有许多附加了验证表单的函数。
  • 验证表单使用users和其他模块中的许多函数。

以另一种方式解释:

一个。 formsusers模块

的第4行导入forms

users.create_user引用forms.Create_User

℃。 forms不知道Create_User但是因为它已在forms模块的第5行声明

1 个答案:

答案 0 :(得分:1)

循环依赖的技巧是分离全局范围中的语句,这样所有不引用从其他模块导入的符号的语句都会在导入之前发生。例如......

<强> forms.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

<强> users.py:

# Import
import forms

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

users方法中Create_User.clean()符号的使用不在全局范围内,因此实际上不需要定义符号直到实际调用该函数的点。