跳转到主要内容

一个装饰器,它优先选择预计算的属性而不是调用装饰的方法。

项目描述

https://img.shields.io/pypi/v/fallback-property.svg Build Status https://coveralls.io/repos/github/jonasundderwolf/fallback-property/badge.svg?branch=master https://img.shields.io/pypi/pyversions/fallback-property.svg

需求

  • Python 3.6+

这是什么?

fallback_property 将一个函数转换为一个属性,并在属性本身未分配值时使用装饰的函数作为后备。内部使用特殊描述符(fallback_property.FallbackDescriptor)。

Django(或类似框架)

fallback_property 对于您有一个从相关对象聚合值的函数很有用,这些值可能已经通过使用注解查询集来获取。装饰器将优先选择预计算的值而不是调用实际方法。

如果您优化应用程序并想用 .annotate() 使用预计算值来替换旧版或性能关键的属性,它尤其有帮助。

如何使用?

只需定义一个函数并使用装饰器 fallback_property

from fallback_property import fallback_property

class Foo:

    @fallback_property()
    def fallback_func(self):
        return 7

参数

fallback_property() 有两个可选参数。

cached: bool = True

如果属性被多次访问,则只调用一次后备函数。

logging: bool = False

如果调用了装饰的原始方法,则记录一个警告。

使用示例(Django)

假设我们有以下模型

from django.db import models


class Pipeline(model.Model):
    @property
    def total_length(self):
        return sum(self.parts.values_list('length', flat=True))


class Parts(models.Model):
    length = models.PositiveIntegerField()
    pipeline = models.ForeignKey(Pipeline, related_name='parts')

调用 pipline.total_length 将始终触发另一个查询,并且当处理多个对象时,成本更高。这可以通过使用 .annotate()fallback_property() 来优化

from django.db import models, QuerySet
from django.db.functions import Coalesce
from django.db.models import Sum
from fallback_property import fallback_property


class PipelineQuerySet(QuerySet):

    def with_total_length(self):
        return self.annotate(
            total_length=Coalesce(
                Sum('parts__length', output_field=models.IntegerField()),
                0,
            )
        )


class Pipeline(model.Model):

    @fallback_property(logging=True)
    def total_length(self):
        return sum(self.parts.values_list('length', flat=True))

现在您可以直接访问 total_length,而不会触发另一个查询或当使用后备函数时收到警告

pipeline = Pipeline.objects.with_total_length().first()
print(pipeline.total_length)

重要:注解值和属性必须具有相同的名称。

开发

此项目使用 poetry 来管理所有开发依赖项。

克隆此存储库并运行

poetry install
poetry run pip install django

以创建具有所有依赖项的虚拟环境。

现在您可以使用以下方式运行测试套件

poetry run pytest

此存储库遵循 angular 提交约定。您可以使用 husky 注册一个 pre-commit 钩子来验证您的提交消息。如果您已安装 nodejs,配置已经就绪。只需运行

npm install

并注册 pre-commit 钩子。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。

源分布

fallback-property-0.2.0.tar.gz (6.0 kB 查看哈希值)

上传时间

构建分布

fallback_property-0.2.0-py3-none-any.whl (5.5 kB 查看哈希值)

上传时间 Python 3

由以下支持