它是一种将Avro架构编译为python类的方法吗?

时间:2015-10-06 16:44:35

标签: python avro

我很好奇这是一种以与Java或C ++实现相同的方式处理Avro Python的方法。

根据官方Avro Python文档,我必须在运行时提供Avro架构来编码/解码数据。但它是否像使用Java / C ++一样使用代码生成器?

4 个答案:

答案 0 :(得分:2)

pyschema是一个非常好的开始,但文档很差。您需要查看源代码以了解它是如何工作的。您可以使用它来读取avro架构并生成python源代码。它增加了另一层抽象,因此减慢了一些事情。

答案 1 :(得分:0)

我没有在任何Python解释器的文档中看到any indication of an existing Avro schema -> Python class code generator(明确提到Java案例的代码生成)。如果你正在使用Jython,你可以使用Java代码生成器创建一个你在Jython代码中访问的类。

与Java和C ++不同,无法生成代码不会对Python性能产生太大影响(无论如何都是在CPython案例中),因为类实例无论如何都是以dict实现的(此规则有例外)从某种意义上说,它们主要是改变内存使用,而不是dict查询总是涉及的事实。这使得代码生成在很大程度上“很好”具有语法糖,而不是开发的必要特征;通过一些努力,你总是可以实现一个转换器而不是在Python中写出class定义和eval来获得类似的效果(这就是collections.namedtuple类的定义方式。 / p>

答案 2 :(得分:0)

avro-gen似乎也可以解决问题。我一直在本地弄乱它,它似乎可以正常工作。

我只需要为php实现以下内容:avro-to-php

答案 3 :(得分:0)

我最近在 Pulsar slack 频道中问过这个问题几次,我相信目前没有任何工具可以将 Avro 模式转换为与 Pulsar Python 客户端库兼容的 Python 类 .

Pulsar Python 客户端库期望 Python 类继承自 Record 类(https://github.com/apache/pulsar/blob/master/pulsar-client-cpp/python/pulsar/schema/definition.py#L57),并且对于 Python 类中的每个字段都继承自 Field 类(https://github.com/apache/pulsar/blob/master/pulsar-client-cpp/python/pulsar/schema/definition.py#L141),在 Pulsar Python 客户端库中定义。

因此,Avro 到 Python 转换器必须从 Python 客户端库中导入 Record 类和 Field 类,因此如果存在这样的转换器,Pulsar Slack 社区中的某些人真的应该知道它。

此外,Pulsar Python 客户端库缺少对 Avro 关键字(如“doc”、“namespace”)和 null 默认值的支持。因此,即使存在 Pulsar 的 Avro 到 Python 转换器,Pulsar Python 客户端库也可能无法正确使用转换后的 Python 类。