Мне нужно добавить множество пользовательских проверок и 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')
Разве Цербер не предоставляет способ сделать это?