我知道每个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
。
我觉得必须安装两个不同的独立软件包以使其工作没有意义,但这似乎是节俭指向我的方向。您认为这是处理它的最佳方式吗?
答案 0 :(得分:0)
我发现解决方案非常简单。使用包名称前缀命名空间并使用包层次结构的命名空间解决了问题,因为所有内容都在正确的位置,并且模块从根包开始正确引用彼此。