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

Python初始化线程时如何向类传参?附NameError报错排查

报错根因

当前触发NameError: name 'iterr' is not defined的直接原因,是你定义App类时在继承位写了不存在的标识符iterr:Python中class 类名(父类):的语法是声明类的继承关系,不存在名为iterr的内置类或你提前定义的类,自然会报未定义错误。
除此之外你的代码还有3处会导致后续运行异常的隐藏问题:

  • App类的__init__方法仅定义了self参数,但你在线程启动时给类传了位置参数i,修复第一个报错后会立刻触发参数数量不匹配的类型错误。
  • 控制线程数量的while循环中没有对计数变量i做自增操作,代码会陷入死循环,无限创建i=1的线程。
  • 读取config/url.txt时循环逐行给table_url赋值,最终只会拿到文件最后一行的内容,如果你文件中仅存储1个目标表格URL不影响运行,但如果是多表格逻辑会出现数据遗漏。
修正后代码
import threading
import gspread

# 无特殊继承需求直接去掉括号内不存在的iterr,__init__补充接收行号参数
class App:
    def __init__(self, row_num):
        # 此处编写单条数据对应的业务处理逻辑,row_num为传入的行序号
        print(f"开始处理第{row_num}行数据")

if __name__ == '__main__':
    # 用with上下文管理读取文件,自动释放文件资源
    with open('config/url.txt', encoding='utf-8') as table_file:
        # 直接读取文件全量内容、去除首尾空白符作为表格URL
        table_url = table_file.read().strip()
    gc = gspread.service_account(filename='config/auth.json')
    sh = gc.open_by_url(table_url)
    worksheet = sh.get_worksheet(0)
    values_list = worksheet.col_values(1)
    thread_total = len(values_list)
    i = 1
    while i < thread_total + 1:
        thread = threading.Thread(target=App, args=(i,))
        thread.start()
        # 计数自增,避免死循环
        i += 1
补充说明
  • 如果你的需求是实例化App后执行类中的某个业务方法,而不是仅完成实例化,需要把线程的target参数替换为对应的实例方法,否则线程启动后只会走完__init__流程就直接退出,不会执行后续业务逻辑。
  • 如果需要等待所有线程执行完毕再结束主线程,可以把每次创建的线程对象存入列表,所有线程启动完成后循环调用每个线程对象的join()方法即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:24:15