【问题标题】:GAE/P transaction using static method使用静态方法的 GAE/P 交易
【发布时间】:2015-09-29 00:43:13
【问题描述】:

我正在尝试弄清楚如何使用事务来组织应用引擎代码。目前我有一个单独的 python 文件,其中包含我所有的事务函数。对于与实体密切相关的事务,我想知道使用@staticmethod 进行事务是否有意义。

这是一个简单的例子:

class MyEntity(ndb.Model):
    n = ndb.IntegerProperty(default=0)

    @staticmethod
    @ndb.transactional # does the order of the decorators matter?
    def increment_n(my_entity_key):
        my_entity = my_entity_key.get()
        my_entity.n += 1
        my_entity.put()

    def do_something(self):
        MyEntity.increment_n(self.key)

increment_n 与实体定义关联会很好,但我从未见过有人这样做,所以我想知道这是否是个坏主意。

我的解决方案:

按照布伦特的回答,我已经实现了这个:

class MyEntity(ndb.Model):
    n = ndb.IntegerProperty(default=0)

    @staticmethod
    @ndb.transactional
    def increment_n_transaction(my_entity_key):
        my_entity = my_entity_key.get()
        my_entity.increment_n()

    def increment_n(self):
        self.n += 1
        self.put()

这样我可以将与实体相关的代码保存在一个地方,并且我可以根据需要轻松使用或不使用事务版本。

【问题讨论】:

  • 为什么要使用静态方法,实际上为什么还要使用类方法?另外我希望你在调用 self.do_something 之后重新加载实例,因为当前的 self 显然已经过时了。您当前对 increment_n 的定义意味着可以传入任何键(即不是 MyEntity 键)。话虽如此,我一直将 classmethods 用于工厂等......我在这里的静态方法中看不到任何值,因为increment_n 的功能似乎非常特定于 MyEntity。
  • 嗨@TimHoffman,我想使用静态方法的原因是事务只对某个实体类型进行操作,我希望事务的代码与其他代码位于同一位置与该实体有关。我的理解是我不能使用常规方法(因为我们需要传递密钥而不是实体)并且在这里使用类方法似乎没有帮助,因为事务不引用类。因此我想我会使用静态方法。
  • 看起来你的方法很有意义。让我们翻转一下:您发现这种方法有问题吗?
  • @BrentWashburne,我还没试过。我对堆叠装饰器感到紧张,因为我是他们的新手,并且不确定正确的顺序是什么。希望在加入之前得到一些建议。

标签: python google-app-engine transactions


【解决方案1】:

是的,在这种情况下使用 @staticmethod 是有意义的,因为该函数不使用类或实例 (self)。

是的,装饰器的顺序很重要,正如@Kekito 稍后的回答中所述。

【讨论】:

  • 谢谢,我已经测试过了,它似乎运行良好。
【解决方案2】:

我后来遇到了this question 的公认答案。这是一个引用:

装饰器会包装它正在装饰的函数。在这里,你的 add_cost 函数由 ndb.transactional 包装,所以一切 函数内发生在事务的上下文中,然后 由 that 返回的方法由返回 a 描述符对象。

所以,当你在一个类中应用多个装饰器时,装饰器 例如 classmethod 或 staticmethod 应该是最上面的。如果你 更改您将收到 TypeError: unbound method ... 的顺序 其他装饰器不接受描述符时的错误类型。

所以看起来装饰器的顺序非常重要。幸运的是,我的顺序正确,但为遇到此问题的其他人更新。

【讨论】:

  • 你是对的,我已经相应地更新了我的答案。虽然最初的问题是关于使用 @staticmethod 是否有意义(装饰器的顺序是一个附带问题)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 2012-12-04
  • 1970-01-01
相关资源
最近更新 更多