user5133357
user5133357

Reputation:

Python: Recursive Structs

I have problem with thrift code generator or python.

Code sample (generated by thrift):

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

Error message:

NameError: name 'SomeClass' is not defined

So I found bug in thrift jira (still opened since 2014). Suggested solution pretty bad.

Can I avoid this problem somehow?

In best case solution in *.thrift or *.py files, that can be changed before or after generation manually.

Upvotes: 0

Views: 421

Answers (2)

user5133357
user5133357

Reputation:

Seems, thats python's genered code contains useless field

SomeClass.spec

So i just delete it.

I compared this with java generated code.

If someone will use my solution dont forget to change generated methods, thats check, when your spec!=None

Upvotes: 0

napuzba
napuzba

Reputation: 6298

Try to replace the code with the following code snippet, Note: it is using lists instead of tuples since tuples are immutable.

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>, [...])]]

Another solution without class methods

class SomeClass:
    spec = None

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

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

Upvotes: 1

Related Questions