2016-07-22 3 views
0

thrift 코드 생성기 또는 파이썬에 문제가 있습니다. (중고품에 의해 생성)파이썬 : 재귀 구조

코드 샘플 :

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

오류 메시지 :

NameError: name 'SomeClass' is not defined 

그래서 나는 (여전히 2014 년 이후 연) 중고품 JIRA에서 bug 발견했다. 제안 된 솔루션은 나쁘다.

어떻게 든이 문제를 피할 수 있습니까?

* .thrift 또는 * .py 파일의 최상의 해결책은 수동으로 생성 전후에 변경할 수 있습니다.

+1

당신은 당신의 질문에 원하는 동작을 포함 할 필요가있을 때, 확인 이잖아, 생성 방법을 변경하는 것을 잊지 말아. –

+0

예상 된 동작 - spec 튜플에 오류가 없습니다. – myTalala

답변

0

은 그게 전부 파이썬의 genered 코드 그래서 난 그냥 삭제 쓸모 필드를

SomeClass.spec 

를 포함 보인다.

나는 자바 생성 코드와 이것을 비교했다.

누군가가 내 솔루션을 사용할 경우

은 사양! = 없음

+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__ 스테이지에서 이미 spec 튜플에 액세스하려는 경우 – myTalala