IPython中导入的最佳实践

4
我正在编写一个 .py 文件,它将在我的 IPython 会话的第一个单元格中定期导入,但也将从其他非交互式会话中导入,因为它包含可以在非交互模式下批量运行的函数。
这基本上是一个包含许多常见类和函数的模块。
由于我正在使用带有--pylab=inline选项的IPython,因此numpy和matplotlib函数已经被导入了,但是当用简单的python mymodule.py批量运行时,需要特别导入numpy函数。
最后,在 IPython 会话中会出现双重导入的情况,这是我不太喜欢的事情。
在这种情况下,最佳实践是什么?重复导入模块不是一种不好的做法吗?

“导入模块两次不是一种不好的做法吗?” - 你为什么这么说? - user2357112
这不是浪费内存吗?我来自C++,在那里导入头文件两次会导致令人讨厌的编译器错误,因此需要使用#pragma和#ifndef。 - linello
不,你可以在循环中导入一个模块200次,或者让A导入B,B再导入A,Python仍然只会执行每个模块的代码一次。(但是循环导入的例子可能会引起其他问题。) - user2357112
1个回答

5

重复导入不是问题。无论一个模块在程序中被导入多少次,在 Python 中,它的代码只会运行一次,并且只会创建一个模块副本。第一次导入后,所有后续的导入都会简单地引用已经加载的模块对象。如果您来自 C++ 背景,可以想象所有模块都有隐式的 include 守卫。


写包时,当从基本文件夹__init__.py中显式导入时,导入的行为是什么?其他'.py'文件不是共享在__init__中的导入吗? - linello
1
@linello:不是的。导入会为整个解释器加载模块,但它只会使名称在单个文件中可用。例如,如果 foo.py 导入了 bar,这只会将 bar 模块分配给模块 foo 中的 bar 变量。每个需要使用模块的文件都需要单独导入它。 - user2357112
感谢您提供这宝贵的信息,解决了我一些困惑 :) - linello

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接