Python / Kivy - ошибка оценки времени выполнения переменной - PullRequest
0 голосов
/ 19 января 2019

проблема заключается в следующем:

У меня есть class DocModel(EventDispatcher): со свойством doc, которое возвращает dict со всеми ненулевыми свойствами, которое я использую в качестве модели для моих ModelView и ModelForm классов

A ModelView - это миксин, который будет использоваться с виджетом для облегчения отображения информации о модели

A ModelForm - это миксин, который будет использоваться с виджетом, который привязывает значения своих входных полей к своей модели, так что любое изменение в поле изменяет свойства модели

Присваивание ModelForm.model, перезаписывает значения его поля ModelForm.model является AliasProperty(_get_model, _set_model, bind=['_model']) и всегда возвращает подкласс DocModel, код выглядит следующим образом:

#models.py
#DocModel is an EventDispatcher with a doc method that returns a dict
class User(DocModel):

    profile = ObjectProperty()


class Profile(DocModel):
    pass


class MetaModelView(object):

    def get_model_cls(self):
        model_cls = self._model_cls
        if isinstance(model_cls, type) and issubclass(model_cls, DocModel):
            return self._model_cls
        else:
            return getattr(sys.modules[__name__], self._model_cls)

    model_cls = AliasProperty(get_model_cls, None)

    _model = ObjectProperty(None, baseclass=DocModel, rebind=True)

    def _get_model(self):
        return self._model

    def _set_model(self, model):
        self.set_model(model)

    model = AliasProperty(_get_model, _set_model, bind=['_model'])


class ModelView(MetaModelView):
    #there is code here, but modelview is woring fine, no need to look into it
    pass


class ModelForm(MetaModelView):

    def set_model(self, model, *args):

        #print 'model form set_model({}, {})'.format(model, args)
        if model is None:
            self.clear_fields()  #sets all fields to default

        if not isinstance(model, self.model_cls):
            #print 'not model_cls'
            if isinstance(model, DocModel):
                #print 'is DocModel'
                model = self.model_cls(**model.doc)
            elif isinstance(model, dict):
                #print 'is dict'
                model = self.model_cls(**model)
            else:
                raise Exception('Invalid model type: {}'.format(type(model)))

        #print self, model
        if self._model is not None:
            #if this is not the first assignment
            #print '#overwrite fields'
            self.set_fields(model.doc)
        else:
            self._model = model

    def set_fields(self, doc={}):
        ids = self.ids
        #print 'ids', ids
        print 'doc', doc

        for field in self.fields:
            print 'setting field {} to {}'.format(field, doc.get(field, None))
            ids[field].data = doc.get(field, None)


#views.py
class Root(ModelView, Relativelayout):

    _model_cls = 'User'


class MyForm(ModelForm, RelativeLayout):

    _model_cls = 'Profile'

Так что в kv я могу сделать что-то вроде этого:

KV = '''
<Root>: #ModelView
    MyForm: #ModelForm
        model: root.model.profile
'''

Так что, когда Root.model.profile изменяется, запускается MyForm._set_model(new_model), и вот здесь возникает проблема

внутри MyForm.set_model(), в строке 62 фрагмента кода выше, я звоню self.set_fields(model.doc) все, что делает этот метод, - это заполняет поля данными из свойства model.doc (dict), и для чего бы то ни было, он делает это но только если я запускаю строку 43 или 58 фрагмента

если запускать с этими закомментированными строками, когда код достигает self.set_fields(model.doc), model.doc - пустой дикт, который, как я знал, не может быть правдой.

поэтому я добавил эти строки, чтобы проверить, передавалась ли пустая модель в set_model, и, как я и ожидал, это не было .. и вот, поля были установлены правильно .. Я был сбит с толку, и попытался закомментировать строку, и проблема повторилась

Я могу нанести несколько отпечатков между ними, но только распечатка модели сама имеет какой-либо эффект

Могу ли я получить некоторые мнения о том, что может происходить и как это решить?

...