web-dev-qa-db-ja.com

Pythonでコールバック関数を使用するには?

python 2.7コールバック関数を正しく使用する方法を疑問に思います。

私のコードには、Cherrypy authの例のコールバック関数がいくつかあります。

(これらのコールバックは、ログインしたユーザーがグループに属しているかどうかに応じて、TrueまたはFalseに評価できる関数を返します。)

次のようなコードを記述した場合、コールバックが実行されるかどうか疑問に思います。

ライブラリの定義は次のとおりです。

def member_of(groupname):
    def check():
        if groupname == 'admin':
          if cherrypy.request.login == 'joe':
            return True
          if cherrypy.request.login == 'toni':
            return True
          return False
        return False
        # .... (other groups checked in the same way)
    return check # returns a callback function from my understanding?

コードでコールバックを適用して実行するにはどうすればよいですか?

このように配置すると:

 if member_of('admin'):
    do_something()
  else:
    do_something_else()

これによりコールバックが実行され、管理グループがチェックされますか?または、「member_of」の値が関数定義であり、関数定義がおそらく常に「True」値(またはFalse値)であるが、実行する必要があるため両方が間違っているかどうかを確認します

これについて教えてもらえますか?コールバックが実行されていることを確認するにはどうすればよいですか?どうすればそのまま渡すことができますか?

16
Alojz Janez

Pythonでは、他の多くの言語と同様に、変数にも関数を含めることができ、たとえば、数字または文字列。

CherryPyのmember_of関数自体は、例では関数を返します。

簡単な手順で説明しています。

member_of()と書くと、この場合はcheckという名前の関数であるmember_of()関数の結果を返します。

cb_function = member_of('admin')

この時点で、変数cb_functionは関数member_ofを呼び出した結果を保持し、最後の行でmember_ofcheckを返します。これは、関数member_of内で別の関数として定義されています。

最初の結果を再度呼び出す必要があります。これは、現在のコンテキストで定義したローカル関数とほぼ同じ方法で処理する必要があるためです。

my_result =  cb_function()

そして、結果を継続して使用します。たとえば、ブール値を確認できます。

if my_result:
  # do something
  ...   

上記の3つのステップをまとめて短く書くことができます。

cb_function = member_of('admin')
  if cb_function():
    # do something
    ...

またはさらに短く:

if member_of('admin')():
  # do something
  ...  

最初はpythonで()()が二重になっているのが少し奇妙に見えるかもしれませんが、しばらく考えてみると意味があります。

15
mit

それを実行する場合、それは単純です。

member_of()はメソッドオブジェクトチェックを返します。 if member_of('admin')():のような何かをして結果を得るために実行する必要があります、または、

k=member_of('admin')
if k():

あなたの仕事をするために。

3
specialscope