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

しかし、それが含まれているフィールドb / cであるMyValidatorと考えているようです:MyOtherValidatorform_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 に答える