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
我在使用 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