formencode在模式中嵌套自定义验证器

时间:2011-05-07 05:25:47

标签: python formencode

我想在我的架构中嵌套我的自定义验证器,如下所示:

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())

但是,它似乎认为MyValidatorMyOtherValidator是字段b / c form_errors包含:

{ 
  'MyValidator': 'Missing value',
  'MyOtherValidator': 'Missing value'
}

如果我不嵌套它们,它们看起来很好。我错过了什么?

2 个答案:

答案 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']

正如您所看到的,这种隐私存在漏洞,但大多数自动工具都会认识到您正试图将某些内容设为私有。