Python:如何在用作参数本身的函数中使用参数?

Python:如何在用作参数本身的函数中使用参数?,python,python-3.x,beautifulsoup,Python,Python 3.x,Beautifulsoup,我正在尝试做一些我不知道是否很难看的事情 我正在尝试做一些网络垃圾,我假装泛化一个函数来提取正确的类 代码是: import requests, re from bs4 import BeautifulSoup as bs def has_label_key(tag): print(tag) return tag.has_attr("data-acc") and tag["data-acc"]=="WOTD" s

我正在尝试做一些我不知道是否很难看的事情

我正在尝试做一些网络垃圾,我假装泛化一个函数来提取正确的类

代码是:

import requests, re
from bs4 import BeautifulSoup as bs

def has_label_key(tag):
     print(tag)
     return tag.has_attr("data-acc") and tag["data-acc"]=="WOTD"

s = requests.Session()
r = s.get("http://dle.rae.es/srv/search",data={"":"diccionario"}
bs(r.text).find_all(has_label_key)[0].id.text
我假装做的是:

def has_label_key(tag,**kwargs):
    print(tag)
    return tag.has_attr(kwargs["label"]) and tag[kwargs["label"]]==key

bs(r.text).find_all(has_label_key(label="data-acc",key="WOTD"}))[0].i.text
我看到的第一个函数和第二个函数之间的第一个区别是,例如,在第一种情况下,tag是一个bs对象,我可以在其中分割和搜索。在第二种情况下,是一个空元组


有没有办法将参数传递给函数has\u label\u key并在函数has\u attr()中使用它?

在这种情况下,您将函数传递给
find\u all

bs(r.text).find_all(has_label_key)[0].id.text
bs(r.text).find_all(has_label_key(label="data-acc",key="WOTD"}))[0].i.text
但是,在第二种情况下,您尝试调用函数并将其结果传递给
find\u all

bs(r.text).find_all(has_label_key)[0].id.text
bs(r.text).find_all(has_label_key(label="data-acc",key="WOTD"}))[0].i.text
(实际上调用函数不起作用,因为它缺少
标记
参数。)

解决此问题的一种方法是使用lambda作为参数,这类似于定义一个新的内联函数:

bs(r.text).find_all(lambda tag: has_label_key(tag, label="data-acc",key="WOTD"}))[0].i.text
另一种方法是在
中定义一个函数,该函数包含捕获外部函数参数的\u label\u key
,然后返回该内部函数:

def has_label_key(label, key):
    def inner(tag):
        print(tag)
        return tag.has_attr(label) and tag[label]==key
    return inner

bs(r.text).find_all(has_label_key(label="data-acc",key="WOTD"}))[0].i.text

另外,您还可以编写
返回标签。获取(标签)=键
。如果属性不存在,
get
函数将返回
None
,而不是引发异常。

在这种情况下,将函数传递给
find\u all

bs(r.text).find_all(has_label_key)[0].id.text
bs(r.text).find_all(has_label_key(label="data-acc",key="WOTD"}))[0].i.text
但是,在第二种情况下,您尝试调用函数并将其结果传递给
find\u all

bs(r.text).find_all(has_label_key)[0].id.text
bs(r.text).find_all(has_label_key(label="data-acc",key="WOTD"}))[0].i.text
(实际上调用函数不起作用,因为它缺少
标记
参数。)

解决此问题的一种方法是使用lambda作为参数,这类似于定义一个新的内联函数:

bs(r.text).find_all(lambda tag: has_label_key(tag, label="data-acc",key="WOTD"}))[0].i.text
另一种方法是在
中定义一个函数,该函数包含捕获外部函数参数的\u label\u key
,然后返回该内部函数:

def has_label_key(label, key):
    def inner(tag):
        print(tag)
        return tag.has_attr(label) and tag[label]==key
    return inner

bs(r.text).find_all(has_label_key(label="data-acc",key="WOTD"}))[0].i.text
另外,您还可以编写
返回标签。获取(标签)=键
。如果属性不存在,
get
函数将返回
None
,而不是引发异常