2

私は簡単にすべきだと思うことをしようとしていますが、それを機能させるのに問題が発生しています。これが私が今持っているもので、期待どおりに機能します。

some_schema = Schema(

   multiples = ForEach(UnicodeString(), convert_to_list=True),
   single = OneOf(['a', 'b'])

)

私がやりたいことは、ユニコード文字列のリストに変換された後、複数値フィールドに MaxLength バリデーターを適用することです。ただし、複合 (All、Pipe など) またはカスタム バリデータを使用した私の試みは気に入らないようです。私の考えでは、これがこれを達成するための最も簡単な方法です。

some_schema = Schema(

   multiples = All(MaxLength(5), ForEach(UnicodeString(), convert_to_list=True)),
   single = OneOf(['a', 'b'])

)

ドキュメントに基づいて、複数値フィールドを Unicode 文字列のリストに変換してから、MaxLength バリデーターを実行し、要素数が 5 を超えると失敗します。失敗部分は機能します:

>>> some_schema.to_python({'single':'a', 'multiples': range(6)})
>>> Invalid: multiples: Enter a value less than 5 characters long

ただし、合格するはずの例が実際には失敗します。

>>> some_schema.to_python({'single':'a', 'multiples': range(3)})
>>> Invalid: multiples: Please provide only one value

formencode のドキュメンテーションは、概して非常に優れていますが、この主題を明らかにすることはできませんでした。ソース コードを見ると、これは Schema クラスからの単一値の予期される例外です。引数をスキーマに渡そうとしaccepts_iterator=Trueましたが、それも失敗します。

スキーマ内のフィールドが Unicode 文字列のリストであり、長さが N 未満であることを確認するにはどうすればよいですか?

4

1 に答える 1

1

私自身の質問に答えました.MaxLengthバリデーターにaccepts_iteratorキーワードを指定する必要があります。

some_schema = Schema(

   multiples = All(MaxLength(5, accepts_iterator=True), ForEach(UnicodeString(), convert_to_list=True)),
   single = OneOf(['a', 'b'])

)

期待どおりに動作します。

于 2014-05-09T16:01:10.173 に答える