e4x风格的python嵌入式dsl,但没有e和x

P4D-Langlet的Python项目详细描述


p4d不是python,但它也很有趣

p4d(=python for data)是用于编写树状结构的EasyExtend langlet 文本数据,也就是XML。

p4d元素以python所熟悉的符号作为语句编写 程序员。它们与python语句非常相似。这里有一个用来定义 元素

elm philosophers:
    philosopher:
        name: "Hegel"
        books:
             book( first_edition = 1807):
                title: "Phänomenologie des Geistes"
                language: "german"
    philosopher:
        name: "Leibniz"
        books:
             book( first_edition = 1714):
                title: "Monadologie"
                language: "french"

elm关键字是新的,它是p4d中断的少数情况之一。 实际的 python代码。但是我没有发现在pythons stdlib中使用elm,所以 可以 一点也没有。

philosophers的子对象可以用e4x样式访问

books = philosophers.philosopher.(name == "Hegel").books
books.book.(@first_edition < 1810).title.text()
# -> "Phänomenologie des Geistes"

p4d还可以用作template语言在python的意义上 表达式可以嵌入到p4d元素中

L = [1,2,3]
elm A:
    B: &L

elm X:
    & A

list对象L的元素将分布在类型b的元素上

assert len(A.B) == 3
assert X.A.B[0].text() == '1'

使用^{tt5}很容易将p4d元素转换为xml元素$ 方法。 否则,可以使用P4D.from_xml()将xml转换为p4d。这太简单了 因为 内部使用相同的数据结构。构建p4d元素并分析 XML文档会导致相同的内部表示。这个内部 表示可用于存储更为不同的对象,这些对象具有 不同的属性,甚至不是文本而是二进制的。

bytelets

除了XML和我们在上面看到的P4D元素之外,Telets还用于处理 二进制数据以灵活的方式。

假设您想序列化一个字符串,而不想使用空终止符。 然后你必须把字符串的长度和字符串一起发送 接收方将hexcode标识为字符串的类型或tag

elm bl:text:
    Tag: 0x50
    Len: &LEN
    Text: "{obamania}"

这个p4d元素产生一个bytelet。BYTelets通常使用 bl命名空间前缀。LEN对象是所谓的Flow对象。它 是一种数据流绑定。如果将LEN绑定到字段,它将计算 后续字段所有值的长度之和。如果你更新BYTELET 将使用LEN重新计算“len”字段的值。

您可以查看此信息

assert text.Len.hex() == 8

这里8只是文本的长度。

new_text = text.clone()
new_text.Text = "{the merkel}"
assert new_text.Len.hex() == 10

我们可以完全计算textbytelet

assert text.hex() == 0x50 0x08 0x6F 0x62 0x61 0x6D 0x61 0x6E 0x69 0x61

请注意,写入0x50 0x08 0x6F ... `` without quotes is valid in P4D and it yields a ``Hex对象不是数字。所以p4d支持增强的十六进制 与Python获得不同语义的文字。

现在我们要将Hex对象转换回bytelet,它必须 被解析。这是由Schema

elm bl-schema:TextSchema:
    Tag: 1
    Len: &LEN
    Text: &VAL

parsed = TextSchema.parse(text.hex())
assert parsed.hex()  == text.hex()

Schema的特征是名称空间前缀bl-schema。否则 它只是另一个带有parse()方法的bytelet。在这里模式有 与原始BYTELET结构完全相同,但字段值不同。这个 新值VAL也是数据流绑定。它绑定到Len字段。 在解析^{tt21}时将值0x08分配给Len之后$ 绑定使用此值从输入流中剪切8字节,然后 分配给文本。

BYTELETS的更多功能:

  • BYTELETS的规格可以通过设置单个位来细化 以及指定位数组宽度。
  • 模式可用于解析^{tt27}的任意序列$ 类似于我们示例中的结构。但是^{tt28}的顺序$ 不用修理。
  • 简单的算法是为Flow对象定义的,比如LENVAL。 所以我们可以写Len : &LEN + 1也可以写Text: &VAL - VAL["IHL"]*4 其中VAL["IHL"]不是指Len,而是指另一个字段IHL

有关详细信息,请查看P4D文档

http://www.fiber-space.de/EasyExtend/doc/p4d/p4d.html

http://www.fiber-space.de/EasyExtend/doc/p4d/bytelets.html

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

推荐PyPI第三方库


热门话题
java如何读取、验证和移动数据。csv文件?   用于在线蛇游戏的java解析scaing   java JavaFX:在窗口上移动元素(阶段)调整大小   mysql如何使用java中的IOUtils包在jsp中显示多个图像?   Java dateFormat不可解析日期异常   spring mvc java。执行单元测试时lang.AssertionError   java在一个webapp中运行多个调度器有什么问题吗?   JAVAlang.ArrayIndexOutofBounds异常:1未来。get()多线程   java使用MDC或spring boot中的任何过滤器屏蔽日志消息中的密码,而不使用logback。xml文件   与应用服务器的java AJP和SSL通信   java Hibernate更新列表中的特定对象   Java小程序:使用keylistener移动多边形   java访问是一个独立于MainActivity的进程   来自服务器的java重复密钥或完整性约束冲突消息:“列“volume”不能为null”   java是否有任何方法可以确保在Flink on job cancel with savepoint上通知所有检查点侦听器检查点完成?