簡體   English   中英

Python:如何在用作參數本身的函數中使用參數?

[英]Python: How can I use arguments in a function used as argument itself?

我正在嘗試做一些我不知道它是否非常丑陋的事情......

我正在嘗試做一些網絡抓取,並假裝概括一個函數來提取正確的類。

代碼是:

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_label_key並在函數has_attr() 中使用它?

在這種情況下,您將一個函數傳遞給find_all

bs(r.text).find_all(has_label_key)[0].id.text

但是,在第二種情況下,您嘗試調用該函數並將其結果傳遞給find_all

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

(實際上調用該函數不起作用,因為它缺少tag參數。)

修復它的一種方法是使用 lambda 作為參數,這就像定義一個新的內聯函數:

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

另一種方法是在has_label_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

PS 你也可以寫return tag.get(label) == key 如果屬性不存在, get函數將返回None ,而不是引發異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM