Python调用无参fill_data传参触发TypeError及函数内写文件问题求助
报错原因
- 直接报错诱因:你定义的
fill_data()函数没有声明任何入参,但在safeit()函数内调用它时传入了{'name'}参数,Python检测到参数数量不匹配,因此抛出该TypeError。 - 额外存在的逻辑问题:
fill_data()仅打印了用户输入的姓名,没有添加return语句返回输入值,直接将该函数的调用结果拼接进字符串写入文件,最终只会得到name : None的无效内容- 代码未手动关闭打开的文件对象,可能出现资源泄漏;同时文件打开模式使用了
w+,每次写入都会清空原有内容,多次添加数据时历史记录会被覆盖 runprogram()中先调用safeit()(内部已调用一次fill_data()),之后又单独调用了一次fill_data(),会导致用户需要重复输入两次姓名,逻辑冗余
修复方案
完整修改后代码
def safeit(): # 改用a+模式追加写入,用with上下文自动管理文件生命周期,无需手动关闭 with open('data_user.txt', 'a+', encoding='utf-8') as myfile: myfile.write(f'name : {fill_data()}\n') def fill_data(): name = input('enter name : ') print(f'name : {name}') # 新增return返回用户输入的姓名 return name def runprogram(): safeit() # 删除冗余的fill_data调用,避免重复输入 quest = input('add data ? (Y/N) : ') if quest == 'Y': runprogram() else: print('thanks to visit us') exit() runprogram()
核心修改点
- 移除了调用
fill_data()时传入的多余参数{'name'},和函数定义的参数规则匹配,解决直接报错问题 - 给
fill_data()新增return语句返回用户输入的姓名,保证写入文件的内容是正确的用户输入值 - 改用
with关键字管理文件操作,执行完写入后自动关闭文件,避免资源泄漏 - 将文件打开模式从
w+改为a+,每次写入内容追加到文件末尾,不会覆盖之前的历史数据 - 删除了
runprogram()中冗余的fill_data()调用,避免用户重复输入两次姓名
可选优化
如果你原本的设计是希望通过传参指定要采集的字段,可以调整fill_data()的定义接收字段名参数,实现更通用的采集逻辑,示例如下:
# 函数新增field形参接收字段名 def fill_data(field): value = input(f'enter {field} : ') print(f'{field} : {value}') return value # 调用时传入对应的字段名即可 myfile.write(f'name : {fill_data("name")}\n')
内容的提问来源于stack exchange,提问作者golead rich
相关产品推荐
相关产品推荐

