跳转到主要内容

智能、Pythonic、临时、Python类型多态

项目描述

classes

classes logo


Build Status codecov Documentation Status Python Version wemake-python-styleguide Telegram chat


智能、Pythonic、临时、Python类型多态。

特性

  • 提供了一组原语来编写声明式业务逻辑
  • 强制更好的架构
  • 完全类型化,使用注解并通过 mypy 检查,兼容 PEP561
  • 允许在不使用继承或接口的情况下编写大量简单代码
  • Pythonic,编写和阅读都很愉快(!)
  • 易于入门:具有大量文档、测试和教程

安装

pip install classes

您还需要正确 配置 mypy 并安装我们的插件

# In setup.cfg or mypy.ini:
[mypy]
plugins =
  classes.contrib.mypy.classes_plugin

不执行此步骤,您的项目将在各个地方报告类型违规。

我们还推荐使用我们相同的 mypy 设置 我们使用的

确保您知道如何开始,查看我们的文档

示例

想象一下,您想将实现绑定到某些特定的类型。例如,字符串的行为是这样,数字的行为是那样,以此类推。

一个好的真实世界示例是 djangorestframework。它围绕这样的想法构建,即不同的数据类型应该以不同的方式转换为和从 json 格式。

“传统”(或者如果你愿意,过时!)的方法是什么?创建大量针对不同数据类型的类并使用它们。

这就是我们最终得到这样的类的原因

class IntField(Field):
    def from_json(self, value):
        return value

    def to_json(self, value):
        return value

这实际上有很多问题

  • 编写此代码很难。我怎么能确保我的 json 可以由给定的模式解析?
  • 它产生了大量模板代码
  • 它有一个复杂的API:通常有几个方法需要重写,一些字段需要调整。此外,我们使用的是类,而不是简单的函数
  • 很难扩展默认库以适应您在自己的项目中创建的新自定义类型
  • 很难重写

应该有更好的方法来解决这个问题!类型类就是一个更好的方法!

这个新API将是什么样的呢?

>>> from typing import Union
>>> from classes import typeclass

>>> @typeclass
... def to_json(instance) -> str:
...     """This is a typeclass definition to convert things to json."""

>>> @to_json.instance(int)
... @to_json.instance(float)
... def _to_json_int(instance: Union[int, float]) -> str:
...     return str(instance)

>>> @to_json.instance(bool)
... def _to_json_bool(instance: bool) -> str:
...     return 'true' if instance else 'false'

>>> @to_json.instance(list)
... def _to_json_list(instance: list) -> str:
...     return '[{0}]'.format(
...         ', '.join(to_json(list_item) for list_item in instance),
...     )

看看如何轻松地处理类型和实现?

类型类表示为一个常规函数,所以您可以像使用它一样使用它

>>> to_json(True)
'true'
>>> to_json(1)
'1'
>>> to_json([False, 1, 2.5])
'[false, 1, 2.5]'

并且很容易通过您自己的类扩展此类型类

# Pretending to import the existing library from somewhere:
# from to_json import to_json

>>> import datetime as dt

>>> @to_json.instance(dt.datetime)
... def _to_json_datetime(instance: dt.datetime) -> str:
...     return instance.isoformat()

>>> to_json(dt.datetime(2019, 10, 31, 12, 28, 00))
'2019-10-31T12:28:00'

这就是类型类如此简单、安全和强大的原因!请确保查看我们的完整文档以获取更多信息。

更多!

想了解更多吗?前往文档! 或者阅读这些文章

— ⭐️ —

Drylabs 维护 dry-python 并帮助那些想在他们的组织中使用它的人。

更多信息请访问 drylabs.io

项目详情


下载文件

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

源分发

classes-0.4.1.tar.gz (28.8 kB 查看散列)

上传时间

构建分发

classes-0.4.1-py3-none-any.whl (36.9 kB 查看散列)

上传时间 Python 3

支持