2017-04-06 18 views
3

を、関数は次のように定義されていますパラメータとしての機能を渡す - BeautifulSoupのドキュメントでBeautifulSoup

def has_class_but_no_id(tag): 
    return tag.has_attr('class') and not tag.has_attr('id') 

そして関数にパラメータとして渡された:find_all()

soup.find_all(has_class_but_no_id) 

私が驚いたのは、それがうまくいったことです。私は実際にどのようにメカニズムが働いているのか分かりませんが、この機能(has_class_but_no_id)は、機能するためのパラメータを持たずにfind_all()関数の値を返します。

答えて

1

has_class_but_no_idは、find_all()に渡すと実行されません。

find_allは、has_class_but_no_idへの呼び出しを複数回実行し、その時点でタグを 'タグ'の値として渡します。これは、Pythonでは関数が一次オブジェクトとして知られていることを利用するパターンです。これらはオブジェクトとして存在し、変数でそれらを渡すことができます。

これにより、関数は、BeautifulSoupがここでやっているように、他の関数を受け入れて後で実行することができます。

def say_something(something_to_say): 
    print something_to_say 

def call_another_function(func, argument): 
    func(argument) 

call_another_function(say_something, "hi there") 

上記の回答がthis Reddit postから取られる:

は、実験してみてください。

また、source code for find_allcallを参照してください。

+0

例の中で何が起こっているのかを説明するために、これを拡張します。find_all()は、ページ内のすべてのタグを処理しています。それぞれに対して、関数への引数として渡しています(上記のように)。その関数がTrueを返すところでは、それは出力されるタグの最終リストに追加されます。すべてのタグのリストに対してfind_all(True)を実行することによって、その機能をテストできます。 –