2016-07-22 65 views
0

我有thrift代碼生成器或Python的問題。的Python:遞歸的Structs

代碼示例(由節儉生成):

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

錯誤消息:

NameError: name 'SomeClass' is not defined 

因此,我發現,在節儉JIRA(自2014仍然打開的)bug。建議的解決方案很不好

我能以某種方式避免這個問題?

在* .thrift或* .py文件最好的情況下的解決方案,可以之前或手動生成之後改變。

+1

你需要在你的問題所需的行爲。 –

+0

預期的行爲 - 規範元組沒有錯誤 – myTalala

回答

0

看來,這就是蟒蛇的genered代碼包含無用場

SomeClass.spec 

所以我就刪除它。

我比較這與java生成的代碼。

如果有人會用我的解決方案不要忘記更改生成的方法,這就是檢查一下,當你的天賦!=無

+0

你能否把任何人都能理解的最後一句話(粗體)帶上?有太多的錯誤,很難猜測你想說什麼。 – JensG

+0

我的意思是如果我們刪除「SomeClass.spec」,我們必須刪除所有下列提及 – myTalala

1

嘗試更換用下面的代碼片段中的代碼,請注意:由於元組是不可變的是使用列表而不是元組。

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 SomeClass: 
    spec = None 

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

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

是的,它的工作原理,但我不能在方法外使用@classmethod。 – myTalala

+0

我已經加入無類法 – napuzba

+0

的解決方案我猜作品只能在外面類的:) 第一個解決方案是相當接近,但在__init__階段IMA早就想訪問規範元組 – myTalala