2016-08-18 2 views
0

私は、以下のリストに類似した汎用再利用可能な検証チェックの成長のリストを持っている:フィルタリングされた関数リストを動的に選択して順序付けするために使用するPythonパターンはどれですか?

1. check_product_name() 
2. check_product_price_within_range() 
3. check_product_expiration_date() 
4. check_product_sizes() 
5. check_foo() 
6. check_bar() 
7. ... 

私もクライアントの成長のリストを持っています。クライアントAはバリデーション1〜5を実装したいが、クライアントBはバリデーション3,6、および4をその順序で実装したいかもしれない。

今、私は以下のような簡単なアプローチを考えています。 (擬似コード、実際の構成は、データベース内に格納されます)

client_a_validations = ['check_product_name', 'check_product_price_within_range', 'check_product_expiration_date', 'check_product_sizes', 'check_foo'] 
client_b_validations = ['check_product_expiration_date', 'check_foo', 'check_product_sizes'] 

私の質問があり、私はこの問題を解決するために参照することができ、より良い、より確立したパターンはありますか?

答えて

1

私はDjangoが良い例になると理解しています。 Djangoにはフォームフィールドとバリデーターの2つのエンティティがあり、1つのフィールドには複数のバリデーターがあります。

from django import forms 

class MyForm(forms.Form): 
    even_field = forms.IntegerField(validators=[validate_even, max_value]) 

これはあなたのケースと似ており、正しいパターンを選択しました。

バリデータの数が本当に多い場合は、バリデータのグループを定義できます。例えば

check_all_product_specs = [check_product_name, check_product_price_within_range, 
check_product_expiration_date] 

client_a_validations = [check_all_product_specs, check_bar] 

と検証の前にちょうどフラットリストにこの入れ子構造を展開します。

+0

入力いただきありがとうございますが、私はdjangoを使用していません。ここでのコンテキストはより一般的であり、Webには関連しません。私はアイテムをキューから取り出し、共通のライブラリを使って評価しています。特定の条件によっては、アイテムを評価するために使用する共通ライブラリ内のメソッドのホワイトリストのみを選択します。 –

+0

私はちょうどDjango(Pythonコードの最高の例の1つと考えられています)の著者が(私が思ったように)同様の問題をどのように決めたかを示したかっただけです。 – g1zmo

関連する問題