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)
问题原因
- 硬取kwargs键值导致KeyError:
kwargs['value_link']这种写法要求kwargs字典中必须存在该键,而你每次只传入一个关键字参数,另外两个键根本不在kwargs里,因此触发KeyError。 - 方法缩进错误:原代码中
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
相关产品推荐
相关产品推荐

