为什么Python会抛出这个错误?

时间:2018-04-09 15:59:36

标签: python jupyter

我已经定义了一个函数,如下所示:

def test_create_dataframe(df):
    cols=set(df.columns)
    return cols

当我将此函数放入Jupyter笔记本并调用它时,它会返回它应该的内容,即:

{'Name', 'accno', 'idno'}

但是,当我创建一个Python模块,导入它,并通过Jupyter笔记本调用该函数时,我收到此错误:

      9 def test_create_dataframe(df):
     10         cols=set(df.columns)
---> 11         return cols
     12 
     13 

AttributeError: 'list' object has no attribute 'intersection'

有人可以解释原因吗?

1 个答案:

答案 0 :(得分:0)

您看到的问题是由于底层的iPython实现。如果你:

  1. 将模块导入主脚本
  2. 运行该主脚本
  3. 对导入到主脚本中的模块进行更改
  4. 再次运行主脚本
  5. 然后,如果你得到回溯,你可能会得到一些非常奇怪的结果。我并不完全确定错误行和显示的文本是如何编织在一起的(行号是正确的,但它显示的那些行号的代码与实际模块不匹配)。当您修改了导入的模块时,可靠的解决方法是重新启动基础iPython内核,但这并不总是实用的。您可以在here

    上找到更多详细信息

    该帖子的修正:

      

    有几种方法可以解决此问题。

         

    1)最简单也是最肯定的是重启ipython内核   更改导入的模块后。但这也有缺点,   特别是丢失了ipython命名空间中存在的数据   任何其他进口模块。

         

    2)对于简单的情况,你可以使用python的重载功能。 (这个   函数是在Python 2中构建的。从Python 3.4开始,它是   从标准模块" importlib")导入。在很多情况下,这个   编辑模块后就足够了。在此简要描述   有关Stack Overflow和其他在线更详细的讨论。

         

    3)对于更复杂的情况,重新加载你拥有的模块   编辑还要求重新加载其依赖/导入的模块   (例如,因为必须将它们初始化为已编辑模块的一部分   初始化),ipython的自动加载扩展可能很有用。看到   http://ipython.readthedocs.org/en/stable/config/extensions/autoreload.html   包括页面底部的重要警告。