2

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

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'
}

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

4

2 回答 2

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'}
于 2011-05-18T23:34:55.393 回答
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']

如您所见,这种隐私存在漏洞,但大多数自动工具会识别出您正在尝试将某些内容设为私有。

于 2011-05-16T22:47:59.873 回答