Как расширить Cerberus Custom Validator на несколько файлов? - PullRequest
0 голосов
/ 24 апреля 2020

Мне нужно добавить множество пользовательских проверок и default_setters для моей Cerberus схемы в Eve

У меня есть этот класс:

class SchemaValidator(Validator):
    def _normalize_default_setter_ns1_fn1(self, document):
    def _normalize_default_setter_ns1_fn2(self, document):
    def _normalize_default_setter_ns2_fn1(self, document):
...

Где ns1 представляет пространство имен1 , fn1 reprsents function1 ... et c

Моя идея состояла в том, чтобы иметь все это в разных классах и динамически использовать setattr для применения этих функций к SchemaValidator, но не работало:

decorators.py

def default_setter(fn):
    return fn

namespace1.py

class Namespace1:

    @default_setter
    def _normalize_default_setter_fn1(self, document):
        return 'ab' if self.root_document['a']['b'] != 'ab' else 'cd'

SchemaValidator.py

class SchemaValidator(Validator):
  ...
  ...

# It is way more complicated, but for a single example I just illustrate the important simplified part of code
setattr(SchemaValidator, '_normalize_default_setter_ns1_fn1', getattr(Namespace1, '_normalize_default_setter_fn1')

Это выглядит слишком сложным и не чистым , это не работает UNLESS Я создаю одно и то же точное имя функции непосредственно в SchemaValidator:

SchemaValidator.py

class SchemaValidator(Validator):
  ...
  ...
  def _normalize_default_setter_ns1_fn1(self, document):
    # This way it works, actually calling the code in Namespace1.py


# It is way more complicated, but for a single example I just illustrate the important simplified part of code
setattr(SchemaValidator, '_normalize_default_setter_ns1_fn1', getattr(Namespace1, '_normalize_default_setter_fn1')

Разве Цербер не предоставляет способ сделать это?

...