Python代码出现keyword argument repeated语法错误,如何修复?
问题分析与修复:HTTP请求类的「keyword argument repeated」错误
错误原因
你代码里所有HTTP请求方法(GET/POST/PUT/PATCH/DELETE)的调用都重复传递了headers关键字参数,比如在requests.delete里同时写了headers=headers和headers={'User-Agent': agent,'Referer': ref}。Python语法禁止同一个函数调用中重复使用相同的关键字参数,这就是触发「keyword argument repeated」错误的直接原因——不止第59行的DELETE请求,其他方法调用也存在同样问题。
修复方案
需要合并请求头参数,而不是重复传递。逻辑是:
- 先初始化一个基础请求头字典,优先使用传入的
headers或实例的self.header - 再将
User-Agent和Referer合并到这个字典中(如果存在的话),避免覆盖原有请求头的其他字段
同时还要修复代码里的其他隐性问题:
- 缺少
time模块导入(代码中使用了time.sleep但未导入) - 主函数中错误调用实例方法:
Requester.request是实例方法,需先创建类实例再调用 status_cod拼写错误,应为status_code- 代理参数格式错误:
requests要求proxies是字典格式(如{'http': 'xxx', 'https': 'xxx'}),当前代码直接传列表会报错
完整修正代码
import random import requests import time # 补充缺失的time模块导入 # FileHanlder & DataHandler is a some other supporting class class Requester: """A class for making HTTP requests.""" def __init__(self, agent=None, header=None, proxy=None, ref=None, ref_file=None, proxy_file=None, agent_file=None, set_agent=False, set_header=False, set_ref=False, set_proxy=False, break_pt=None): self.agent = 0 self.ref = 0 self.proxy = 0 self.header = header or {} # 初始化为空字典,避免后续合并出错 self.break_pt = break_pt if agent_file is not None: self.agent = FileHandler.read(agent_file) elif set_agent: self.agent = agent else: self.agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' if ref_file is not None: self.ref = FileHandler.read(ref_file).split('\n') elif set_ref: self.ref = ref if proxy_file is not None: self.proxy = FileHandler.read(proxy_file).split('\n') elif set_proxy: self.proxy = proxy def request(self, url, method='get', params=None, data=None, json=None, headers=None, cookies=None, timeout=5, redirect=True, verify=True, proxy=None, ref=None, agent=None, break_pt=None): # 处理请求间隔 if break_pt is None: break_pt = self.break_pt if break_pt is not None: time.sleep(random.uniform(break_pt[0], break_pt[1])) # 优先使用传入参数,否则用实例属性 current_agent = agent or self.agent current_ref = ref or self.ref current_proxy = proxy or self.proxy # 合并请求头:先取传入的headers,没有则用实例的header,再添加User-Agent和Referer current_headers = headers or self.header.copy() if current_agent: current_headers['User-Agent'] = current_agent if current_ref: current_headers['Referer'] = current_ref # 处理代理格式(示例,需根据实际代理字符串调整) proxies = None if current_proxy: # 假设代理是单个字符串,如"http://xxx:port",需根据实际情况调整 proxies = {'http': current_proxy, 'https': current_proxy} # 统一调用请求方法,避免重复代码 try: req_method = getattr(requests, method.lower()) ret = req_method( url, params=params, data=data, json=json, headers=current_headers, cookies=cookies, timeout=timeout, allow_redirects=redirect, verify=verify, proxies=proxies ) return ret except AttributeError: raise ValueError(f"Unsupported HTTP method: {method}") if __name__ == '__main__': # 创建Requester实例 requester = Requester() # 调用request方法 response = requester.request('https://www.google.com/') print('ok' if response.status_code == 200 else 'failed')
关键优化点
- 移除重复的
headers参数,改为合并字典的方式传递 - 使用
getattr(requests, method.lower())统一处理请求方法,减少重复代码 - 修复代理参数的格式问题,符合
requests库的要求 - 修正主函数中的实例调用和拼写错误
- 初始化
self.header为空字典,避免合并时出现None类型错误
内容的提问来源于stack exchange,提问作者coderooz
相关产品推荐
相关产品推荐

