如何解决Jupyter运行Python代码时出现'module'对象不可调用错误
报错原因与解决方案
核心原因
你的代码本身不存在语法或逻辑错误,报错是Jupyter Notebook内核运行时的命名空间被历史操作污染导致的:
Jupyter的内核会保留所有历史运行代码产生的变量、导入的模块,和IDE每次运行新开进程、使用全新命名空间的逻辑完全不同。你之前的操作大概率把代码中用到的某个可调用对象的名称,赋值成了模块对象,再次调用同名对象时就会抛出TypeError: 'module' object is not callable。
你感知到的「无法对float类型变量调用str()方法」是错觉,本质是当前str指向的是模块而非内置构造函数,和入参的float类型没有任何关系。
常见触发场景
- 内置函数
str被覆盖:你之前的代码大概率出现过import xxx as str、或者创建了名为str.py的本地文件并执行了import str的操作,导致当前命名空间里的str不再是内置的字符串类型构造函数,而是一个模块对象,调用str(usd)时就会触发报错。 - 自定义函数名
gbp_to_usd被覆盖:你之前如果导入过同名的Python文件(比如本地有gbp_to_usd.py且执行过import gbp_to_usd),或者曾经把gbp_to_usd变量赋值为其他模块对象,也会在调用该名称时触发报错。
验证方法
在定义你的函数之前,新增两个单元格分别执行如下代码,即可定位问题:
# 查看str的类型,正常应该返回 <class 'type'> print(type(str))
# 查看gbp_to_usd的类型,你没定义过的话应该报NameError print(type(gbp_to_usd))
如果任意一个的输出是<class 'module'>,就说明对应的名称被污染了。
解决方案
- 最快修复方案:点击Jupyter界面的「重启内核并运行全部单元格」按钮,清空历史命名空间后重新运行你的代码即可正常执行。
- 不重启内核的修复方案:执行
del 被污染的名称(比如del str或del gbp_to_usd),手动删除占用名称的模块对象,再重新运行你的代码即可。
内容的提问来源于stack exchange,提问作者Piyush
相关产品推荐
相关产品推荐

