16

Python 2.7 コールバック関数を正しく使用する方法を知りたいです。

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

(これらのコールバックは、ログインしているユーザーがグループに属しているかどうかに応じて、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 値) であるかどうかを調べますが、実行する必要があるため、両方が間違っています。

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

4

2 に答える 2

15

Python では、他の多くの言語と同様に、変数に関数を含めることもでき、数値や文字列などを含む他の変数と同じように関数を渡すことができます。

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

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

書くと、この場合member_of()の名前の関数である関数 member_of() の結果が返されます。check

cb_function = member_of('admin')

この時点で、変数cb_functionは関数を呼び出した結果を保持member_ofし、最後の行で、関数内で別の関数として定義された をmember_of返します!checkmember_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 で double を使用するのは少し奇妙に思えるかもしれませんが()()、しばらく考えてみれば理にかなっています。

于 2013-08-21T10:06:45.160 に答える
3

実行してみると、至ってシンプル。

member_of()メソッド オブジェクト チェックを返します。if member_of('admin')(): または、

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

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

于 2013-06-13T07:29:23.133 に答える