2

我正在使用 django-fsm 来实现状态机。代码看起来像

def user_ok_to_check_me( instance, user):
    ... 

class Job( models.Model):

# ... many screenfulls of code

    @transition( field=state,  target=BOOKING, source=CHECKING, permission=user_ok_to_check_me)
    def fail_checking(self, **kwargs):
    ...

它正在工作。在它所属的类之外有那个小实用函数会损害代码的可读性,所以我尝试了

class Job( models.Model):

    # ... many screenfulls of code

    @staticmethod
    def user_ok_to_check_me( instance, user):
        ... 
    @transition( field=state,  target=BOOKING, source=CHECKING, permission=user_ok_to_check_me)
    def fail_checking(self, **kwargs):

这是行不通的。不知道user_ok_to_check_me现在做什么,它的行为就像一个无操作函数总是返回 True 即使它所做的只是return False

为什么?有没有办法在类中声明这个小函数?(使用时间有点长 lambda instance, user:

4

1 回答 1

0

找到了答案,虽然我不确定我是否理解它。

class Job( models.Model):

    # ... many screenfulls of code

    # @staticmethod  #NO DECORATOR
    def user_ok_to_check_me( instance, user):
    ... 
    @transition( field=state,  target=BOOKING, source=CHECKING, permission=user_ok_to_check_me)
    def fail_checking(self, **kwargs):

ok_to_check_mein的使用@transition发生在创建类的代码执行期间,而不是在其实例化期间。所以它需要引用上面定义的实际函数。对该函数的应用@staticmethod会用其他东西替换它,而不管是什么,过渡装饰器都不能接受。

当类被实例化时,函数被绑定到实例。但是,这不会影响对@transition已存储在其内部的函数的引用。在这种情况下,绑定是无害的,因为instance通常self指的是相同的。在其他情况下,可能希望在其方法中从实例中删除非预期的绑定函数__init__(或者只是大量记录不尝试将其用作对象方法)。

于 2020-03-10T09:24:01.517 回答