You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python线程类用**kwargs传参出现KeyError问题求助

问题原因与解决方法

问题描述

我用继承threading.Thread的ParseThreading类实现多线程传参,调用时仅传入var_xpath和一个布尔关键字参数(如value_date=True),但类的__init__方法中直接通过kwargs['value_link']等方式取值,导致抛出KeyError。原本需求是每次仅使用三个关键字参数中的一个,之前曾尝试给变量默认设为False,修改后仍报错,想明确问题原因。

报错信息

File "c:\dev\scripts\scratch.py", line 33, in 
thread_lnk_date_applied = ParseThreading("//th[contains(text(),'Application Validated')]/following-sibling::td", value_date=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "c:\dev\scripts\scratch.py", line 7, in __init__
self.value_link = kwargs['value_link']
~~~~~~^^^^^^^^^^^^^^
KeyError: 'value_link'

原类定义

class ParseThreading(threading.Thread):
    def __init__(self,var_xpath,**kwargs):
        threading.Thread.__init__(self)
        self.value_link = kwargs['value_link']
        self.value_date = kwargs['value_date']
        self.value_status = kwargs['value_status']
        self.var_xp = var_xpath

def run(self):
    if self.value_date:
        try:
            var_date = WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,self.var_xp))).text
            self.value_date = datetime.datetime.strptime(var_date,'%a %d %b %Y').strftime('%d/%m/%Y')
        except TimeoutException:
            self.value_date = '-'
    if self.value_status:
        try:
            var_status = WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,self.var_xp))).text
            self.value_status = var_status
        except TimeoutException:
            self.value_status = '-'
    if self.value_link:
        try:
            var_link = WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,self.var_xp)))
            self.value_link = var_link.get_attribute('href')
        except TimeoutException:
            self.value_link = '-'

原调用代码

thread_lnk_date_applied = ParseThreading("//th[contains(text(),'Application Validated')]/following-sibling::td", value_date=True)
thread_lnk_date_decision = ParseThreading("//th[contains(text(),'Decision Issued Date')]/following-sibling::td",value_date=True)
thread_status_decision = ParseThreading("//th[contains(text(),'Decision')]/following-sibling::td",value_status=True)
thread_doc_link = ParseThreading("//p[@class='associateddocument']/a",value_link=True)

问题原因

  1. 硬取kwargs键值导致KeyError:kwargs['value_link']这种写法要求kwargs字典中必须存在该键,而你每次只传入一个关键字参数,另外两个键根本不在kwargs里,因此触发KeyError。
  2. 方法缩进错误:原代码中run方法没有缩进在ParseThreading类的内部,这是语法错误,线程无法执行这个方法(它会被当成独立函数)。

解决方法

方式一:直接给参数设置默认值(更直观)

修改__init__方法,直接为三个关键字参数指定默认值False,无需依赖**kwargs:

class ParseThreading(threading.Thread):
    def __init__(self, var_xpath, value_link=False, value_date=False, value_status=False):
        super().__init__()  # 用super()替代直接调用父类构造方法,更规范
        self.value_link = value_link
        self.value_date = value_date
        self.value_status = value_status
        self.var_xp = var_xp

    def run(self):  # 必须缩进在类内部
        if self.value_date:
            try:
                var_date = WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,self.var_xp))).text
                self.value_date = datetime.datetime.strptime(var_date,'%a %d %b %Y').strftime('%d/%m/%Y')
            except TimeoutException:
                self.value_date = '-'
        if self.value_status:
            try:
                var_status = WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,self.var_xp))).text
                self.value_status = var_status
            except TimeoutException:
                self.value_status = '-'
        if self.value_link:
            try:
                var_link = WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,self.var_xp)))
                self.value_link = var_link.get_attribute('href')
            except TimeoutException:
                self.value_link = '-'

方式二:用kwargs.get()获取默认值(保留**kwargs)

如果坚持使用**kwargs,改用get方法获取值,不存在时返回默认值False:

class ParseThreading(threading.Thread):
    def __init__(self, var_xpath,**kwargs):
        super().__init__()
        self.value_link = kwargs.get('value_link', False)
        self.value_date = kwargs.get('value_date', False)
        self.value_status = kwargs.get('value_status', False)
        self.var_xp = var_xp

    def run(self):  # 修正缩进
        # 后续run方法内容同方式一,略

内容的提问来源于stack exchange,提问作者miPythOff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 02:52:19