从模块导入功能而不丢失模块标识符

时间:2014-06-27 11:25:02

标签: python

我正在寻找一种从模块导入单个函数的方法,而不会丢失函数名中的模块名称。例如,

from os import remove

给我留下了一个名为'remove'的函数;在代码的其他地方,它并不清楚它来自os模块。但是,这会引发语法错误:

from os import remove as os.remove

这几乎令人满意(并且可能):

from os import remove as os_remove

但同样不完全清楚这是来自os模块;如果可能的话,保持点数是可爱的

为什么我要这样做?好吧,这里有一个让我去研究这个问题的前提 - 如果有人能告诉我其中任何一个都是有缺陷的,这本身就是一件好事:

  • 如果您只想使用模块中的一个功能,那么只导入它比导入整个模块更有效。

  • 如果在您的代码中使用os.remove,那么将其标记为更清晰,因此它对其他所有人来说都是透明的,这个函数是什么以及它的行为方式。当然,这可以从import语句中辨别出来,但似乎在整个代码中都很有用。

如果这是不可能的,我有兴趣了解阻止它的原因。

3 个答案:

答案 0 :(得分:4)

你的第一个前提是有缺陷的。导入一个函数与整个模块没有区别。

为了从模块导入任何东西,Python必须首先读取,解析并执行整个模块。导入一个函数与整个函数的唯一区别是在当前命名空间中分配了什么名称:在这种情况下,它将是模块的一个名称,或者函数的一个名称。换句话说,没有任何区别。

答案 1 :(得分:1)

只需导入模块:

import os

现在您可以参考os.remove

请注意导入整个模块,无论您选择绑定什么名称; from os import remove不会阻止导入模块的其余部分。见difference between various import statements in python

答案 2 :(得分:1)

实际上Kenneth Reitz解释在Python Guide中将包/模块导入为Python哲学;

非常糟糕

[...]
from modu import *
[...]
x = sqrt(4)  # Is sqrt part of modu? A builtin? Defined above?

<强>更好

from modu import sqrt
[...]
x = sqrt(4)  # sqrt may be part of modu, if not redefined in **between

<强>最佳

import modu
[...]
x = modu.sqrt(4)  # sqrt is visibly part of modu's namespace