【问题标题】:Best practices when importing in IPython在 IPython 中导入时的最佳实践
【发布时间】:2014-03-03 10:51:09
【问题描述】:

我正在编写一个 .py 文件,该文件将在第一个单元格中的一些 IPython 会话开始时定期导入,但也会从其他非交互式会话中导入,因为它包含可以在其中运行的函数在非交互模式下批处理。

它基本上是一个包含许多非常常见的类和函数的模块。

由于我使用带有--pylab=inline 选项的IPython,numpy 和matplotlib 函数已经被导入,但是当使用简单的python mymodule.py 批量运行时,必须专门导入numpy 函数。

最后我会在 IPython 会话期间提出双重导入,这是我不太喜欢的事情。

在这种情况下,最佳做法是什么?两次导入模块不是不好的做法吗?

【问题讨论】:

  • “两次导入模块不是不好的做法吗?” - 为什么这么说?
  • 这不是内存浪费吗?我来自 C++,其中两次导入头文件会导致严重的编译器错误,所以 #pragma 和 #ifndef
  • 没有。您可以在循环中导入一个模块 200 次,或者让 A 导入 B 导入 A,Python 仍然只会执行每个模块的代码一次。 (不过,循环导入示例可能会导致一些其他问题。)

标签: python numpy module matplotlib ipython


【解决方案1】:

重复导入不是问题。无论一个模块在程序中被导入多少次,Python 只会运行一次它的代码,并且只复制一个模块。第一个之后的所有导入将仅引用已加载的模块对象。如果您来自 C++ 背景,您可以想象所有模块都具有隐式包含保护。

【讨论】:

  • 在编写包时,从基本文件夹__init.py 显式导入时,导入的行为是什么?其他 '.py` 文件不是共享 __init__ 中的导入吗?
  • @linello:不。导入会为整个解释器加载模块,但它只会使名称可用于单个文件。例如,如果foo.py 执行import bar,这只会将bar 模块分配给模块foo 内的bar 变量。每个需要使用模块的文件都需要单独导入。
  • 感谢您提供这些宝贵的信息,它解决了我的一些困惑:)
猜你喜欢
  • 2011-01-01
  • 1970-01-01
  • 2011-01-27
  • 2018-02-28
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多