2012-04-23 11 views
4

ある引数値を正規表現パターンと照合し、一致する場合にのみ続行します。これは私のアプリケーション内の多くの場所で発生するので、私は機能をチェックし、私が必要なときにその機能を呼び出させることにしました。今、ほとんどの場合、私はそのチェックは右のビューの最初に実行する必要があるので、私はそうのようなデコレータとして、それを作成しました:デコレータと同じ状態で、通常の機能と同じですか?

def validate(f): 
    def _inner(request, argument=None): 
     if argument is None: 
      return HttpResponse(content="No argument given", status=400) 
     elif not re.match('^SOME_REGEX$', argument): 
      return HttpResponse(content="Invalid argument", status=400) 
     else: 
      return f(request, argument) 
    return _inner 

しかし、私はそれチェッカーを呼び出す必要があり、他の例があります内には、ネストされた条件の一部としての関数があります。私はそれを直接呼び出すことはできないようです。 。デコレータと同じコードを通常の関数と同じように使用できる方法はありますか?それとも、2回入力する必要がありますか?

def validate(argument): 
    return re.match('^SOME_REGEX$', argument) 

し、必要に応じてvalidate関数を呼び出しデコレータを書く:

答えて

3

あなたは確かにそれを2回入力する必要はありません、あなただけの値を取り、それを検証validate関数を作成することができます:

def requires_valid(f): 
    def _inner(request, argument=None): 
     if argument is None: 
      return HttpResponse(content="No argument given", status=400) 
     elif not validate(argument): 
      return HttpResponse(content="Invalid argument", status=400) 
     else: 
      return f(request, argument) 
    return _inner 

もちろん、あなたがvalidateNoneのチェックを移動する場合がありますので、私はあなたのユースケースを知らないが、ポイントは、あなたが二度同じ正規表現を繰り返す必要はありません。

そして、あなたはより深い魔法掘り下げるように感じるとの両方のデコレータと検証と同じ機能を使用して主張すれば、あなたはこのような何かを試してみてください:

def validate(f): 
    if callable(f): 
     def _inner(request, argument=None): 
      if argument is None: 
       return HttpResponse(content="No argument given", status=400) 
      elif not validate(argument): 
       return HttpResponse(content="Invalid argument", status=400) 
      else: 
       return f(request, argument) 
     return _inner 
    else: 
     return re.match('^SOME_REGEX$', f) 

しかし、私はこれに対して助言するだろう、パラメータのタイプに応じて2つの非常に異なる処理を行う1つの関数があるからです。その結果、理解しにくいコードになります。 ( "あなたは文字列を受け取りブールを返すこの関数でビューを飾っていますか?")

+0

これは美しく動作します、ありがとう!私は 'callable()'について知らなかった - それは私が調べる非常に実用的なもののように思える。 – joschaf

関連する問題