Python:递归结构

Python: Recursive Structs

我在使用 thrift 代码生成器或 python 时遇到问题。

代码示例(由 thrift 生成):

class SomeClass:
    spec = (
            (1, (SomeClass, SomeClass.spec)),
    )

错误信息:

NameError: name 'SomeClass' is not defined

所以我在 thrift jira(自 2014 年以来仍然开放)中找到 bug。建议的解决方案非常糟糕。

我能以某种方式避免这个问题吗?

在 *.thrift 或 *.py 文件中的最佳情况解决方案,可以在生成之前或之后手动更改。

尝试用以下代码片段替换代码,注意:它使用列表而不是元组,因为元组是不可变的。

class SomeClass:
    spec = None
    @classmethod
    def init(cls):
        cls.spec = []
        cls.spec.append( [ 1 , (cls, cls.spec) ] )

SomeClass.init()

print( SomeClass.spec )       # [[1, (<class SomeClass>, [...])]]

另一种没有 class 方法的解决方案

class SomeClass:
    spec = None

SomeClass.spec = []
SomeClass.spec.append( [ 1 , (SomeClass, SomeClass.spec) ] )

print( SomeClass.spec )       # [[1, (<class SomeClass>, [...])]]

似乎是 python 的生成代码包含无用字段

SomeClass.spec

所以我直接删了

我将其与 java 生成的代码进行了比较。

如果有人会使用我的解决方案,请不要忘记更改生成的方法,那就是检查,当你的规格!=None