Python开发#amrevx自动响应Twitter Bot报TypeError: 预期路径类对象非int
报错根因定位
核心触发原因是函数调用时的参数传递顺序和函数定义的形参顺序完全颠倒。
逐行逻辑拆解
- 先看自定义存储函数的定义规则:
这个函数要求的传参顺序是:第一个位置传入需要写入文件的推文ID(对应形参def store_last_seen(last_seen, FILE_NAME): file_write = open(FILE_NAME, 'w') file_write.write(str(last_seen)) file_write.close() returnlast_seen),第二个位置传入存储文件的路径字符串(对应形参FILE_NAME)。 - 再看执行完推文回复、点赞、转推操作后的调用代码:
这里两个参数完全传反了:store_last_seen(FILE_NAME, tweet.id)- 本应放推文ID的第一个参数位置,传了表示文件路径的字符串
FILE_NAME - 本应放文件路径的第二个参数位置,传了整数类型的
tweet.id
对应到函数内部执行open(FILE_NAME, 'w')这行代码时,形参FILE_NAME实际接收到的是整数类型的tweet.id,而Python的open()方法要求传入路径类型的字符串/路径对象,不支持整数类型入参,因此直接抛出TypeError中断程序。
- 本应放推文ID的第一个参数位置,传了表示文件路径的字符串
附带的代码冗余与逻辑隐患
在匹配到带#amrevx标签的推文分支里,代码连续写了两次store_last_seen调用:
- 第一次在所有API交互操作执行前调用,参数顺序是正确的
- 第二次在所有操作完成后调用,参数顺序错误触发报错
这种重复调用本身没有必要,还会引入新的逻辑漏洞:如果在第一次调用之后、API交互执行的过程中出现网络异常、接口权限报错等问题,程序会提前中断,但此时文件里已经写入了当前的推文ID,下次启动程序时就会跳过这条已经被记录、但实际未完成交互的推文。
最小修正方案
- 删掉API操作执行前那一次提前触发的存储调用
- 把最后那行参数传反的存储调用,调整为和函数定义顺序匹配的写法:
store_last_seen(tweet.id, FILE_NAME)
调整后程序就不会再触发该类型错误,同时也能保证只有当一条推文的所有交互操作都执行完成后,才更新已处理的推文ID记录。
内容的提问来源于stack exchange,提问作者Aryaman Srivastava
相关产品推荐
相关产品推荐

