VSCode中Jupyter Notebook导入Python脚本函数报错:float object argument after ** must be a mapping, not int 的解决方法
你遇到的这个问题确实有点棘手——同一个函数直接粘到Notebook里能正常运行,但从.py文件导入就触发float object argument after ** must be a mapping, not int的错误。我来帮你拆解可能的原因和对应的解决办法:
可能的原因及解决方案
1. .py文件里的函数定义和你复制的版本不一致
有时候编辑.py文件时,可能不小心改动了符号或格式,比如:
- 把英文的
**(幂运算符号)误写成了中文星号,或是被编辑器自动转换成了上标符号 - 表达式的括号、空格出错,导致Python把
**错误解析成了关键字参数的展开操作(这正是错误提示的来源)
解决办法:
打开你的.py文件,逐行对比和Notebook里能正常运行的函数代码,重点检查10**-3这类幂运算的写法,确保**是两个连续的英文星号,没有被篡改。
2. 模块缓存导致加载了旧版本的函数
Jupyter Notebook会缓存已经导入的模块,如果你之前修改过.py文件,但没有重新加载模块,当前Notebook环境里调用的还是旧的、有错误的函数版本。
解决办法:
在Notebook里执行以下代码重新加载模块(把your_module_name换成你的.py文件的名字,不带.py后缀):
import importlib import your_module_name importlib.reload(your_module_name)
之后重新导入函数并调用试试。
3. .py文件缺少必要的依赖导入
你的函数里用到了math.sin,如果.py文件开头没有写import math,导入函数调用时会找不到math模块——虽然通常会报NameError,但也不排除某些情况下触发连锁的奇怪错误。
解决办法:
在你的.py文件最顶部添加:
import math
保存文件后,重新加载模块再测试。
4. 调用函数时的参数传递有误
虽然你说直接粘函数到Notebook里调用正常,但导入函数后可能不小心误用了**传递参数(比如写成pressure2depth(**P, L, Del)),这会触发**需要mapping类型的错误。
解决办法:
确认导入后的调用代码和Notebook里正常运行的调用代码完全一致,比如正常调用是pressure2depth(100, 30, 0.5),导入后也要保持同样的写法。
5. 测试.py文件本身是否能正常运行
为了排除Jupyter环境的问题,你可以直接在.py文件末尾添加测试代码,比如:
import math def pressure2depth (P, L, Del): # calculate depth from pressure sensor # pressure (P) : in dbar # latitude (L) : degree # Geopotential anomaly (Del) : dyn meteres X = math.sin(L / 57.29578)*math.sin(L / 57.29578) GR = 9.780318 * (1.0 + (5.2788*(10**-3) + (2.36*(10**-5)) * X) * X) + (1.092*(10**-6)) * P DepthTerm = ((( (-1.82*(10**(-15))) * P + 2.279*(10**(-10))) * P - 2.2512*(10**(-5)) ) * P + 9.72659) * P DEPTH = DepthTerm / GR + Del / 9.8 return DEPTH # 测试调用 print(pressure2depth(100, 30, 0.5))
然后在终端直接运行这个.py文件,如果报错,说明问题出在.py文件本身,根据终端的错误提示再排查;如果能正常输出结果,那问题就回到Jupyter的模块加载上。
内容的提问来源于stack exchange,提问作者Dong-gyun Kim

