Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中节约使用子命名空间_Python_Namespaces_Thrift - Fatal编程技术网

在python中节约使用子命名空间

在python中节约使用子命名空间,python,namespaces,thrift,Python,Namespaces,Thrift,我知道每个旧文件都应该定义一个新的名称空间。但我不确定子名称空间是什么,特别是python代码生成如何处理它们 为了说明我的混淆点,我将给出一个简单的例子 假设我们在示例中有下面的节俭定义。节俭 namespace py schema include "service.thrift" union KeyQuality { 1: service.QA service_qa } struct Key { 1: required KeyId id 2: required

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

为了说明我的混淆点,我将给出一个简单的例子

假设我们在
示例中有下面的节俭定义。节俭

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
(这太棒了),但是
schema.ttypes
将尝试导入名为
schema.service
的包,它将失败

看起来,
thrift
正在处理名称空间层次结构,因为它将
服务
包放在
模式
下,但在导入包时,它做得不好

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


我觉得必须安装两个不同的独立软件包才能工作是没有意义的,但这似乎是thrift给我指出的方向。你认为那是最好的解决方法吗?

我发现解决方法非常简单。在名称空间前面加上包名并让名称空间遵循包层次结构可以解决这个问题,因为这样所有的东西都在正确的位置,模块从根包开始正确地相互引用。

我发现解决方案非常简单。在名称空间前面加上包名并使名称空间遵循包层次结构可以解决这个问题,因为这样一来,所有东西都在正确的位置,模块从根包开始正确地相互引用。

这一点很好。我建议也要考虑这个问题。好点。我建议在这个问题上也考虑一下这个问题。