【不降级的解决方案】ModuleNotFoundError: No module named ‘numpy.testing.decorators‘

之前发现代码报错,出现这个提示,第一反应是在百度和csdn上找,没想到找了一整圈,都在建议我用降级numpy的方法来解决

pip install numpy==1.17.0

注:当前代码因为包的版本出现问题时,除非在实现逻辑上新包引入了恶性bug(且包的维护者停止了更新或者无力解决 ),否则极其不推荐降级包;大多数因为升级了包的版本而让原先代码报错的原因,都是因为新的包里面对调用方法、命名空间这类顶层进行了修改,我们要做的事情是

  1. 找到对应包的官方API或者文档说明,阅读更新记录,发现问题根源
  2. 在对应新版本的API或者文档中,找到与原有代码出错处相同或相似的目录,看看新的包是否更新了语法或者调用方式
  3. 根据新的包的标准,重写自己的程序代码

根据这个报错的情景不同,可以将解决方法细分为以下两类

  • 自行主动import这个包时出错
  • 出现这个问题的情况90%以上不是自己写的代码,而是跟随某个教程/代码包练习的时候出现这个问题,原因很简单:numpy.testing.decorators这个模块很不常用,如果真的是自己主动要用这个模块的,其代码能力应该不至于对着这个问题犯难,也不至于连包更新了都不知道……

    还是以开头这张图里面的代码为例,开头的报错:
     

     图中直接指出了问题代码所在:

    from numpy.testing.decorators import slow

     想要从numpy.testing.decorators这个模块里面引入与slow相关的命名空间,但是发现numpy.testing.decorators这个模块本身就不存在

    阅读numpy的文档后发现,其实从1.15版本开始,试图使用numpy.testing.decorators就会收到warning(但是warning不是error,所以很多人忽略了)说当前用法会在未来版本淘汰

     

     而从1.18版本开始,numpy正式淘汰了numpy.testing.decorators这一系列模块名(注意:只是淘汰了模块名,他们实质上包含的内容还在),并且贴心地告诉用户,要用umpy.testing.decorators里面的功能(命名空间),只需要import numpy.testing 就够了,自当前版本开始的testing自动会包含原有的testing.decorations等子模块

    图中三个黑框的大意:1、名字删了,别用了;2、 要用这个功能直接去import nunpy.testing;3、我1.15版本开始警告你了,瞅啥瞅,3个小版本还不够你改变代码习惯的吗?

    所以以后直接

    import numpy.testing

     就可以了,删掉旧代码里面任何提到numpy.testing.decorator的内容吧(或者将其替换为numpy.testing)

  • 引入其他包时被其他包自动import numpy.testing.decorator
  • 这种情况稍麻烦一点,博主没有遇到,但是有其他博客提到了

    import numpy 报错:ModuleNotFoundError: No module named ‘numpy.testing.nosetester‘ 晓物智联_52phm社区的博客-CSDN博客_import numpy报错import numpy 报错:ModuleNotFoundError: No module named ‘numpy.testing.nosetester’报错信息在import numpy的时候编译器提示这个问题,就很奇葩,报错信息如下所示ModuleNotFoundError: No module named 'numpy.testing.nosetester'解决方法感觉问题很奇怪,就搜索了一下,然后在stackoverflow上找到了解决方法,更新scipy模块的版本。问题的原因是nhttps://blog.csdn.net/wang_ningning/article/details/112469585?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-112469585-blog-103738505.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-112469585-blog-103738505.pc_relevant_paycolumn_v3

    这种情况出现时,就是因为其他包依赖于numpy.testing.decorator,因此当这个包在numpy早些版本被创建时,为了使用numpy.testing.decorator相关功能,它会自动去引入numpy.testing.decorator。而numpy更新后,这个包还没有更新,其内部代码仍然是 import numpy.testing.decorator,故报错。

    解决方式也很简单,升级这个包到最新版本(而不是第一反应让numpy去降级!!!)

    pip install –upgrade [包名]

    一般来说,频繁更新、维护的包,当其依赖的numpy更新后,这个包的维护者也应该尽快修改自己包的内容,升级后就能解决这个bug。

    如果作者坐视不管,或者这个包已经停止更新了,又或者这个包过于冷门以至于作者不知道这个bug存在,建议舍弃这个包,找类似功能的其它包来实现,或者这个时候才考虑降级numpy吧~.

    后记/碎碎念

    并非说降级一定不能用,但是降级一定不是第一选择,更不可能是唯一选择,提倡看到版本问题就降级的思路是一种很不科学的思路,我认为这是有害无益的。

    冷知识:写下这篇博客时,numpy版本已经到1.22了,距离1.18版本发布已经过去三年了……

    然而,前期搜攻略时,看到了如下发言,属实让人血压升高(已对关键身份信息打码,对事不对人) 

    在2022年倡导大家把版本回退到2019年的版本???? 并且措辞十分坚定,“必须”这样做才能解决问题?

    为了避免有人说我断章取义,这位博主其实放了下面这句话,

    但是 ……我还是觉得整篇文章的误导性很强, 不讲其所以然,也不把自己搜到的关键信息放出来给大家讨论,一句轻飘飘的“没有用,大家可以自己试试”,引导大家“脑袋放空”,照做去降级就可以解决问题。

    编程哪有现成的?都得自己去动脑筋,如果代码连同业务逻辑连同解决问题的思路都能100%搜出来,那世界上还要程序猿这种需要创造力的职业干什么呢?

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【不降级的解决方案】ModuleNotFoundError: No module named ‘numpy.testing.decorators‘

    发表评论