【问题标题】:Import function from module without losing module identifier [duplicate]从模块导入功能而不会丢失模块标识符[重复]
【发布时间】:2014-06-27 11:25:02
【问题描述】:

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

from os import remove

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

from os import remove as os.remove

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

from os import remove as os_remove

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

我为什么要这样做?好吧,这是导致我对此进行调查的前提 - 如果有人能告诉我其中任何一个存在缺陷,那么这本身就是一件很棒的事情:

  • 如果您只打算使用模块中的一个函数,那么只导入它比导入整个模块更有效。

  • 1234563当然,这可以从 import 语句中辨别出来,但它似乎在整个代码中都很有用。

如果这不可能,我很想知道是什么阻止了它。

【问题讨论】:

    标签: python


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      只需导入模块:

      import os
      

      现在你可以参考os.remove

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

      【讨论】:

        【解决方案3】:

        实际上,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
        

        【讨论】:

          猜你喜欢
          • 2022-01-09
          • 1970-01-01
          • 1970-01-01
          • 2021-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多