框架的声明式脚手架

declare的Python项目详细描述


https://img.shields.io/travis/numberoverzero/declare/master.svg?style=flat-squarehttps://img.shields.io/codecov/c/github/numberoverzero/declare/master.svg?style=flat-squarehttps://img.shields.io/pypi/v/declare.svg?style=flat-squarehttps://img.shields.io/pypi/status/declare.svg?style=flat-squarehttps://img.shields.io/github/issues-raw/numberoverzero/declare.svg?style=flat-squarehttps://img.shields.io/pypi/l/declare.svg?style=flat-square

框架的声明式脚手架

安装

pip install declare

开始

让我们为布雷艇区块建立一个快速模型:

from declare import Model, Field, TypeDefinition
import json

# Wire format is json:
# {
#   "type": int     <- maps to enum
#   "position": str <- packed x:y:z
# }

class BlockType(TypeDefinition):
    types = {
        0: "Grass",
        1: "Stone",
        2: "Diamond"
    }
    def load(self, value, context):
        return BlockType.types[value]

    def dump(self, value, context):
        # TODO: index types by value for O(1) lookup
        for tid, name in BlockType.types.items():
            if value == name:
                return tid


class Position(TypeDefinition):
    ''' [x, y, z] <--> "x:y:z" '''
    def load(self, value, context):
        return [int(v) for v in value.split(':')]

    def dump(self, value, context):
        return ':'.join(str(v) for v in value)


class Block(Model):
    type = Field(BlockType)
    position = Field(Position)

    @classmethod
    def load(cls, wire):
        fields = cls.Meta.fields_by_model_name
        engine = cls.Meta.type_engine
        wire = json.loads(wire)
        kwargs = {}
        for name, field in fields.items():
            kwargs[name] = engine.load(field.typedef, wire[name], {})
        return cls(**kwargs)

    @classmethod
    def dump(cls, obj):
        fields = cls.Meta.fields_by_model_name
        engine = cls.Meta.type_engine
        kwargs = {}
        for name, field in fields.items():
            kwargs[name] = engine.dump(
                field.typedef, getattr(obj, name), {})
        return json.dumps(kwargs)

让我们设置请求处理程序以使用这些块:

from bottle import route, request

@route('/diamond_check')
def func():
    wire = request.json
    block = Block.load(wire)
    if block.type == "Diamond":
        return {"diamond": True, "position": block.position}
    return {"diamond": False}

或者,创建菱形:

@route('/make_diamond')
def func():
    wire = request.json
    position = Position.load(wire)
    block = Block(type="Diamond", position=position)
    return Block.dump(block)

嵌套模型

模型也是类型定义的实例。这意味着模型可以被使用 作为字段,使递归加载/转储变得简单:

class List(TypeDefinition):
    ''' Adapter for lists of objects '''
    def load(self, value, context):
        return [self.typedef.load(v, context) for v in value]
    def dump(self, value, context):
        return [self.typedef.dump(v, context) for v in value]


class Region(Model):
    blocks = Field(List(Block))

    @classmethod
    def load(cls, wire):
        fields = cls.Meta.fields_by_model_name
        engine = cls.Meta.type_engine
        wire = json.loads(wire)
        kwargs = {}
        for name, field in fields.items():
            kwargs[name] = engine.load(field.typedef, wire[name], {})
        return cls(**kwargs)

    @classmethod
    def dump(cls, obj):
        fields = cls.Meta.fields_by_model_name
        engine = cls.Meta.type_engine
        kwargs = {}
        for name, field in fields.items():
            kwargs[name] = engine.dump(
                field.typedef, getattr(obj, name), {})
        return json.dumps(kwargs)

实际上,来自Block的相同加载/转储代码在这里是可用的,因为我们 只是从json加载/转储。当类型引擎查找 对于List(Block)类型的加载/转储函数,它将迭代加载/转储 使用block.load和block.dump方法的每个块。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java本机方法的源代码可用吗?   java如何使父方法抛出异常?   java Android以编程方式设置不同屏幕大小/密度的布局   java如何使用一个变量来管理所有客户端请求   java输入一个txt文件,每行有一组数字   json java从jsonobject获取jsonarray错误   java将一个(WAV)写入一个文件只会说一个单词(最后一个单词)   java Telnet忽略原始字节   proguard java。运行桌面应用程序时出现lang.VerifyError   java用左键移动JLabel?   java如何在jText区域验证选项卡?   文件服务器客户端Javasocket编程中的字符串搜索   java省略了JSTL中的最后一个逗号<c:out>   java如何找到if或else代码已执行的次数?   java JavaScript WebSocket send()方法未执行   浮点数声明上的java标识符预期错误   java这是指二进制搜索算法吗?   编译mod at:reobfJar java时的minecraft问题。util。拉链ZipException:重复条目   java检测特定的震动运动(如图所示:D)