2010-02-10 3 views
1

__get__ 메서드를 사용하여 개체 목록을 serialize하면 __get__이 호출되지 않고 원시 (사용자 지정 __get__에 의해 처리되지 않음) 값이 __set__에서 사용됩니다. 파이썬의 json 모듈은 어떻게 항목을 반복 처리합니까?파이썬의 JSON 모듈은 __get__을 사용하지 않습니까?

참고 : 직렬화하기 전에 목록을 반복 할 경우 올바른 값은 __get__입니다.

그것은 모든 일이 실패 할 경우 수행 할 작업에 대한 방법 및이를 수행하는 방법 문서를 제공

+0

예를 들려 줄 수 있습니까? – interjay

+0

'__get__'과'__set__' 메쏘드는 기술자 프로토콜을 위해 사용됩니다. 그것들은 클래스의 속성 일 때만 호출되어야하며, 클래스 나 인스턴스에서 이러한 속성을 가져 오거나 설정하는 중입니다. –

+0

재미있는 것은, 값을 할당 할 때'__set__'이 호출 되었기 때문에, 검색 할 때 항상'__get__'이 호출 될 것이라고 생각했습니다. – Carson

답변

1
그것은 개체가 특정 값 또는리스트, 튜플, 또는 dicts의 isinstances을인지 여부를 확인

... :

파이썬 3.1.2 문서에서

import simplejson 
class IterEncoder(simplejson.JSONEncoder): 
    def default(self, o): 
    try: 
     iterable = iter(o) 
    except TypeError: 
     pass 
    else: 
     return list(iterable) 
    return simplejson.JSONEncoder.default(self, o) 

simplejson.dumps(YourObject,cls=IterEncoder) 
+0

사실, 이미 사용자 정의 json 인코더를 사용하고 있습니다. 그 값은'__get__'의 결과가 아니라 원시 값으로 주어집니다. 어떤 아이디어? – Carson

+0

직렬화하려고하는 객체의 예를 게시 할 수 있습니까? 현재 나에게 보이는 것처럼, 만약 여러분이 이처럼 인코더를 사용한다면, 반복 된 객체는'chunks'리스트에서'.join (chunks)'로 전달 될 것입니다. – MattH

0

은 (여기지만 그렇지 않으면 편집되지 않은보기 위해 다시 포맷) :

json.dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, 
      allow_nan=True, cls=None, indent=None, separators=None, 
      default=None, **kw) 

기본값 (obj)obj의 serializable 버전을 반환하거나 TypeError을 가져와야하는 함수입니다. 기본값은 단순히 TypeError입니다.

따라서 __get__ 함수는 default=yourcustomjsonencoder.__get__ 또는 이와 비슷한 형식으로 전달되어야합니까? 그냥 생각. 나는 벗어날 수있다. (아마 그렇 겠지만) 최소한의 아이디어이다.

관련 문제