thrift在python中使用子命名空间

时间:2017-05-02 09:46:08

标签: python namespaces thrift

我知道每个thrift文件都应该定义一个新的命名空间。但我不确定子命名空间是什么,特别是python代码生成如何处理它们。

为了说明我的困惑,我将举一个简单的例子

假设我们在example.thrift

中有节俭定义
namespace py schema

include "service.thrift"


union KeyQuality {
    1: service.QA service_qa
}

struct Key {
    1: required KeyId id
    2: required KeyQuality quality
}

在另一个文件service.thift中我们有

namespace py schema.service

struct QA {
    1: required string YES_NO
}

现在,如果我使用thrift -r --gen py example.thrift生成python代码,我将获得一个名为schema的python包,其中包含另一个名为service的包(这很棒)但是{{1}将尝试导入名为schema.ttypes的包,它将失败。

似乎schema.service正在处理命名空间层次结构,因为它将thrift包置于service之下,但在导入包时它并没有做得很好。

如果不是schema而是将第二个文件的命名空间定义为schema.service,那么将在与包service相同的级别上创建一个单独的包,导入将再次失败因为schema会尝试导入schema.ttypes

我觉得必须安装两个不同的独立软件包以使其工作没有意义,但这似乎是节俭指向我的方向。您认为这是处理它的最佳方式吗?

1 个答案:

答案 0 :(得分:0)

我发现解决方案非常简单。使用包名称前缀命名空间并使用包层次结构的命名空间解决了问题,因为所有内容都在正确的位置,并且模块从根包开始正确引用彼此。