, 기본 인수는 번을 평가하는 - 그래서 당신은 사용하고 하나의dict
종류 Test
의 모든 엔티티에 걸쳐 (당신의 default={}
프로세스 당 하나의 DICT, 개체 당되지 하나입니다!)하는 동일한 프로세스 내에서 발생하고 p
이 명시 적으로 설정되지 않은 경우
t=Test(p={})
을 입력하면 t
은 괜찮습니다. dict
입니다. t=Test()
을 수행 한 다음 t.p = {}
을 입력하면 문제가 없습니다. 그러나 엔티티의 특정 p
을 설정하지 않으면 동일한 프로세스 내에서 p
이 설정되지 않은 해당 종류의 모든 엔티티에서 사용되는 동일한 기본 값 dict
을 사용하게됩니다 명시 적으로.
때 put
Test
엔티티, 데이터 저장소에 어떤 일이 일어나는지 그 당시의 p
의 절인 "스냅 샷"- 당신 get
다시, 그것은 그 상태로 복원, 지금은 다른 가능한 연결이 끊어집니다 default
단일 -dict
-per-process를 사용합니다. 그러나 이것들은 그 모호한 사용법에서의 예외 일뿐입니다.
간단히 말해서, 변경 가능한 기본값는 파이썬에서 좋은 생각이 아니다 - 사람들은 좀처럼 올바르게 사용합니다. 그리고 적어도 다른 파이썬 호출 가능 호출만큼 ndb.PickleProperty
에 대한 호출에도 적용됩니다!
추가 : 당신이 PickleProperty
이 도움이 될 수 있습니다 서브 클래스, 특히 DICT를 개최하고, 너무 복잡 명시 적으로 p={}
당신이 개체의 종류를 인스턴스화 할 때마다 추가 찾기 위해 PickleProperty
이 필요합니다. 즉 :
class DictPickleProperty(ndb.PickleProperty):
def __init__(self, **kwds):
kwds['default'] = kwds.get('default', {})
super(DictPickleProperty, self).__init__(**kwds)
당신이 default
은 (A) 인 경우 지정 또는 dict
하지 무언가로 지정 (B)는, 당신의 몫입니다하지 싶습니다. 이 간단한 예제는 (B)의 경우 특별한 것은 없습니다 - (예를 들어 default=[]
은 여전히 문제를 일으킴) - (A)의 경우 새로운 empy dict
을 사용합니다.
다른 방법으로는 (예외를 발생시킬 것이다 그래서 []
또는 {}
새로운 dict
빈, 그러나 많은 다른 값을 만들 것입니다) 새로운 dict
에 어떠한 제공 default
값을 변환하려고 할 수 있습니다
kwds['default'] = dict(kwds.get('default',()))
또는 , 물론, 많은 다른 변종.
@Alex Martelli DictPickleProperty는 완벽한 솔루션처럼 보였지만 포함 된 ndb Model 클래스의 새 엔터티를 만들 때 속성의 '__init__' 메서드가 호출되지 않습니다. 즉, 질문의 샘플에서 p를 DictPickleProperty()로 변경 한 다음't1 = Test()'를 인스턴스화합니다. 그러나 DictPickleProperty'의 init은 호출되지 않습니다. 내가 놓친 게 있니? – patb