跳转到主要内容

统一性

项目描述

Build Status

直接的统一性,通过分发进行扩展。

示例

>>> from unification import *
>>> unify(1, 1)
{}
>>> unify(1, 2)
False
>>> x = var('x')

>>> unify((1, x), (1, 2))
{~x: 2}

>>> unify((x, x), (1, 2))
False

@unifiable
class Account(object):
    def __init__(self, id, name, balance):
        self.id = id
        self.name = name
        self.balance = balance

data = [Account(1, 'Alice', 100),
        Account(2, 'Bob', 0),
        Account(2, 'Charlie', 0),
        Account(2, 'Denis', 400),
        Account(2, 'Edith', 500)]

id, name, balance = var('id'), var('name'), var('balance')

>>> [unify(Account(id, name, balance), acct) for acct in data]
[{~name: 'Alice', ~balance: 100, ~id: 1},
 {~name: 'Bob', ~balance: 0, ~id: 2},
 {~name: 'Charlie', ~balance: 0, ~id: 2},
 {~name: 'Denis', ~balance: 400, ~id: 2},
 {~name: 'Edith', ~balance: 500, ~id: 2}]

>>> [unify(Account(id, name, 0), acct) for acct in data]
[False,
 {~name: 'Bob', ~id: 2},
 {~name: 'Charlie', ~id: 2},
 False,
 False]

函数分发

统一性支持通过模式匹配进行函数分发。

from unification.match import *

n = var('n')
@match(0)
def fib(n):
    return 0

@match(1)
def fib(n):
    return 1

@match(n)
def fib(n):
    return fib(n - 1) + fib(n - 2)

>>> map(fib, [0, 1, 2, 3, 4, 5, 6, 7, 8, 0])
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

这种模式匹配可能相当复杂

name, amount = var('name'), var('amount')

@match({'status': 200, 'data': {'name': name, 'credit': amount}})
def respond(name, amount):
    balance[name] +=  amount


@match({'status': 200, 'data': {'name': name, 'debit': amount}})
def respond(name, amount):
    balance[name] -= amount


@match({'status': 404})
def respond():
    print("Bad Request")

在示例目录中查看完整示例。

性能和可靠性

这是一个快速拼凑的版本。统一性强调可扩展性而非性能,初步基准测试显示这比基于元组的直接统一性慢2-5倍。

这相当可靠,唯一的警告是集合统一性,这在框架中一般很难实现。它应该适用于中等复杂的情况,但在非常复杂的情况下可能会崩溃。

历史

这是从LogPyMultiple Dispatch项目中提取出来的。

作者

Matthew Rocklin

项目详情


下载文件

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

源代码分发

unification-0.2.2.tar.gz (6.8 kB 查看哈希值)

上传时间: 源代码

构建分发

unification-0.2.2-py2.py3-none-any.whl (10.1 kB 查看哈希值)

上传时间 Python 2 Python 3

支持者