一个装饰器,它优先选择预计算的属性而不是调用装饰的方法。
项目描述
需求
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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d38ade19054561af1ff1a75d31039f5433dc69a6f0dab575f4325f6cf3309a9e |
|
MD5 | c7720246d53735c7d191e90c47cf7045 |
|
BLAKE2b-256 | ac6869bf9263c237af25f1c9a72a6f81e5faee98190820d96f5d3149b724f328 |