我想在我的架构中嵌套我的自定义验证器,如下所示:
MySchema(Schema):
class MyValidator(validators.FancyValidator):
def _to_python(self, value, state):
...
class MyOtherValidator(validators.FancyValidator):
def _to_python(self, value, state):
...
field_foo = All(validators.NotEmpty(),
MyValidator())
field_bar = All(validators.NotEmpty(),
MyOtherValidator())
但是,它似乎认为MyValidator
和MyOtherValidator
是字段b / c form_errors
包含:
{
'MyValidator': 'Missing value',
'MyOtherValidator': 'Missing value'
}
如果我不嵌套它们,它们看起来很好。我错过了什么?
答案 0 :(得分:2)
我的建议是:您应该将FancyValidator
子类定义移动到全局范围,或者(1)在使用它们的Schema
定义之前的同一模块中,或者( 2)在单独的模块中以便更好地重复使用。除非有特殊原因需要嵌套,否则模块命名空间中的一些额外的类名称不应该受到伤害。
例如:
from formencode import All, FancyValidator, Schema, validators
class MyValidator(FancyValidator):
def _to_python(self, value, state):
return value + '_foo'
class MyOtherValidator(FancyValidator):
def _to_python(self, value, state):
return value + '_bar'
class MySchema(Schema):
field_foo = All(validators.NotEmpty(), MyValidator())
field_bar = All(validators.NotEmpty(), MyOtherValidator())
print MySchema().to_python({'field_foo': 'x', 'field_bar': 'y'}, None)
结果:
{'field_foo': 'x_foo', 'field_bar': 'y_bar'}
答案 1 :(得分:0)
在python中,您在类中定义的任何内容都是字段。 是静态变量,用self,方法或类设置的变量。 如果你想“隐藏”这些类,或者让它们“不那么公开”,可能是python字典中正确的措辞,你应该用__开始它们的名字。
>>> dir(X())
['A', '_B', '_X__C', '__doc__', '__module__']
>>> class X:
... class A: pass
... class __B: pass
... c = 0
... __d = 1
...
>>> dir(X())
['A', '_X__B', '_X__d', '__doc__', '__module__', 'c']
正如您所看到的,这种隐私存在漏洞,但大多数自动工具都会认识到您正试图将某些内容设为私有。