跳转到主要内容

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

项目描述

classes logo


Build Status Coverage Status Documentation Status Python Version wemake-python-styleguide Checked with mypy


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

特性

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

安装

pip install classes

您还需要正确 配置 mypy 并安装我们的插件来修复 此现有问题

# In setup.cfg or mypy.ini:
[mypy]
plugins =
  classes.contrib.mypy.typeclass_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 covert 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])
'[false, 1, 2]'

并且很容易扩展这个类型类以适应您自己的类

>>> # 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'

这就是类型类简单、安全、强大的原因!请确保查看我们的文档了解更多信息。

许可证

BSD 2-Clause

项目详情


下载文件

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

源分布

kinds-0.0.1.tar.gz (4.7 kB 查看哈希值)

上传时间

构建分布

kinds-0.0.1-py3-none-any.whl (4.0 kB 查看哈希值)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页