Как программно определить, является ли свойство ndb многозначным

Я перевожу приложение из Datastore в ndb и столкнулся с проблемой в процедуре импорта xml. Проблема в том, что я не могу программно определить, является ли свойство класса ndb.model многозначным или нет.

Я подозреваю, что это связано с отсутствием базовых навыков Python, поскольку код, который я придумал до сих пор, показывает, что значение «видимо». Таким образом, я не могу схватить его. Пожалуйста помоги.

from google.appengine.ext import ndb

class House(ndb.Model):
  name = ndb.StringProperty()   
  rooms = ndb.StringProperty(repeated=True) 

print 'Properties:'
for p in House._properties:
  print getattr(House,p)

print '\nRepeated:'
for p in House._properties:
  print getattr(getattr(House,p),'repeated',None)

Это приводит к следующему:

Properties:
StringProperty('rooms', repeated=True)
StringProperty('name')

Repeated:
None
None

person Arne S    schedule 21.05.2012    source источник
comment
ОК, я просмотрел исходный код и обнаружил, что в классе свойств есть доступный атрибут с именем «_»повторяется». Это работает, но у меня есть подозрение, что «_» означает, что он не предназначен для внешнего доступа.   -  person Arne S    schedule 22.05.2012


Ответы (2)


На самом деле параметры с префиксом подчеркивания являются официальным API. Это ошибка, что они не задокументированы, я это исправлю. Я объяснил немного больше здесь: http://code.google.com/p/appengine-ndb-experiment/issues/detail?id=187

В частности, для получения свойств модели следует использовать House._properties, а не тот код, который предложил Ник. (На самом деле __dict__ может быть заменено слотами в будущих версиях NDB.)

person Guido van Rossum    schedule 22.05.2012
comment
Спасибо, мистер Россум, что разъяснил. - person Arne S; 23.05.2012

В настоящее время NDB не предлагает каких-либо возможностей для самоанализа созданных моделей; вам обязательно следует сообщить об ошибке по этому поводу. В то же время, заглянуть во внутренности объекта — единственный способ сделать это. Имейте в виду, что это очень хрупко, так как детали внутренней реализации могут и будут меняться в любое время.

Вы можете получить список свойств следующим образом:

properties = [(k, v) for k, v in House.__dict__.items() if isinstance(v, ndb.Property)]

Вы можете определить, повторяется ли свойство, обратившись к внутреннему атрибуту _repeated в экземпляре, но см. мой отказ от ответственности выше, почему это, вероятно, плохая идея:

House.rooms._repeated

OR

getattr(House, 'rooms')._repeated
person Nick Johnson    schedule 22.05.2012
comment
Спасибо, Ник. Я добавил это как ошибку как предложенный. - person Arne S; 22.05.2012