2016-07-22 18 views
0

thriftコードジェネレータまたはPythonに問題があります。Python:再帰構造体

(古道具によって生成された)コードサンプル:

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

エラーメッセージ:

NameError: name 'SomeClass' is not defined 

だから私は(まだ2014年から開か)リサイクルJIRAでbugを発見しました。提案された解決策はかなり悪い。

どういうわけかこの問題を回避できますか?

* .thriftまたは* .pyファイルのベスト・ソリューションでは、手動で生成する前または後で変更できます。

+1

。 –

+0

予想される動作 - 仕様タプルのエラーなし – myTalala

答えて

0

ので、私はちょうどそれを削除

SomeClass.spec 

Pythonのgeneredコードは役に立たないフィールドが含まれてthatsの、ようです。

これをjava生成コードと比較しました。

誰かが私の解決策を使用する場合には、生成されたメソッド、thatsのチェック、ときに仕様を変更することを忘れていけない!=あなたは、あなたの質問に目的の動作を含める必要なし

+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__段階で既に仕様タプル – myTalala