Skip to main content

蟒蛇组合

项目描述

构建状态

PyComb

Python 3 的Tcomb端口。它提供了一种应用运行时类型检查的方法。

安装

pip install pycomb

基本示例

from pycomb import combinators

# A simple string
MyStringType = combinators.String
s1 = combinators.String('hello')  # This IS a 'str' object
s2 = combinators.String(10)  # This will fail

# A list that contains only strings
ListOfStrings = combinators.list(combinators.String)
l1 = ListOfStrings(['1', '2', '3'])  # This IS a native tuple
l1 = ListOfStrings(['1', '2', 3])  # This will fail

# Structured data
User = combinators.struct(
    {
        'name': combinators.String,
        'age': combinators.Int,
        'city': combinators.maybe(combinators.String)
    }
)
my_user = User({'name': 'John Burns', 'age': 30})  # This IS a dict
my_user2 = User({'name': 'John Burns', 'age': '30'})  # This will fail
my_user3 = User({'name': 'John Burns', 'age': 30, 'city': 'New York'})  # This IS a dict

# Subtypes
SmallString = combinators.subtype(
    combinators.String,
    lambda d: len(d) <= 10)  # Strings shorter than 11 characters
SmallString('12345678901')  # This will fail
SmallString('12345')  # This IS a 'str' object

# Constants
john_data = {'name': 'John'}
John = combinators.constant(john_data, name='JohnConstant')
John({'name': 'John'})
John({'name': 'Jack'})  # Error on JohnConstant: expected JohnConstant but was dict


# Regexp with groups
import re
def name_condition(d):
    return d in ('John', 'Jack')
def age_condition(d):
    return int(d) > 0

Name = combinators.subtype(combinators.String, name_condition, name='Name')
Age = combinators.subtype(combinators.String, age_condition, name='Age')
NameAndAge = combinators.regexp_group('(\w+) +(-?[0-9]+)', Name, Age, name='NameAndAge')
NameAndAge('John 32')  # Ok
NameAndAge('John 3x')  # Error on NameAndAge: expected NameAndAge but was str
NameAndAge('John -32')  # Error on NameAndAge[1]: expected Age but was str
NameAndAge('WRONG 32')  # Error on NameAndAge[0]: expected Name but was str

验证上下文

验证过程在控制以下内容的上下文中运行:

  1. 发生错误时的行为

  2. 生产模式:如果激活,验证期间不会引发此类错误

上下文示例

from pycomb import combinators, context

# Example of production mode
ListOfNumbers = combinators.list(combinators.Number, 'ListOfNumbers')
production_ctx = context.create(production_mode=True)
numbers = ListOfNumbers([1, 2, 'hello'], ctx=production_ctx)  # This will NOT fail


# Example of custom behavior in case of error
class MyObserver(context.ValidationErrorObserver):
    def on_error(self, ctx, expected_type, found_type):
        print('Expected {}, got {}'.format(expected_type, found_type))

ListOfNumbers = combinators.list(combinators.Number, 'ListOfNumbers')
notification_ctx = context.create(validation_error_observer=MyObserver())
numbers = ListOfNumbers([1, 2, 'hello'], ctx=production_ctx)  # This will NOT fail
# Expected output:
# > Expected Int or Float, got <class 'str'>

装饰器

可以包装函数以保护输入参数,或确保其返回值的类型

装饰器示例

from pycomb import combinators

# Example of input parameters check
@combinators.function(
    combinators.String, combinators.Int,
    c=combinators.Float, d=combinators.list(combinators.Int))
def f(a, b, c=None, d=None):
    pass
f('John', 1, c=1.0, d=[3, 4])  # OK
f(1, 1, c=1.0, d=[3, 4])  # This will fail

# Example of output check
@returning(cmb.subtype(cmb.String, lambda d: len(d) < 10))
def f(n):
    return ' ' * n

f(3)  # OK
f(10)  # This will fail

支持更多类型,例如:

  • 工会

  • 十字路口

  • 功能

  • 枚举

所有基本类型都有一个默认示例字段。请阅读测试代码以找到更多示例。

项目详情


下载文件

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

源分布

pycomb-0.1.18.tar.gz (16.2 kB 查看哈希

已上传 source