跳转到主要内容

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'

类型类就是这样简单、安全、强大的!请确保查阅我们的文档以了解更多信息。[查看文档](https://github.com/dry-python/classes)

许可证

BSD 2-Clause

项目详情


下载文件

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

源代码分发

effects-0.0.1.tar.gz (10.8 kB 查看哈希值)

上传时间 源代码

构建分发

effects-0.0.1-py3-none-any.whl (9.5 kB 查看哈希值)

上传时间 Python 3

支持者

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