如何使包模块中的函数立即可用于 Python3 中的根应用程序

Posted

技术标签:

【中文标题】如何使包模块中的函数立即可用于 Python3 中的根应用程序【英文标题】:How do I make functions from a package module immediately available to root application in Python3 【发布时间】:2018-06-08 12:31:58 【问题描述】:

有没有办法从根级主应用程序导入包中的所有模块,并在 Python 3 中立即使用模块中的函数?这是一个示例文件树:

+app
  |- __init__.py
  |- main.py
  |+ package
    |- __init__.py
    |- module.py #(contains function1, function2 and function 3)

我想避免在 main.py 中使用以下 import 语句(对于复杂的应用程序,它可能会变得冗长而草率):

from package.module import function1, function2, function3

这很好,因为它让我可以从 main.py 调用 function1()。 仅从 package.module 导入一个函数意味着我必须调用函数的完整目录才能在我的脚本中使用它(或在新函数中为其命名)。例如:

import package.module

package.module.function(param)#not fun...too long!

#or like this
def newFunction(param):
   '''why create a new function to handle an already existing one?
      Bad form and non Pythonic'''
   return package.module.function(param)

如果我在我的包的__init__.py 中包含__all__ = ["module1", "module2"],这意味着我必须执行以下操作:

from package import * #it is said this is bad form as well

module.function(param)
#I just want the function and don't want to call module also

我的目标是导入包和模块,然后充分使用模块中的所有功能,而无需在每次我想使用该功能时显式调用包和模块。思路如下:

import package.module

function1(x)

我已阅读documentation for Python 3 about modules and packages。感谢您的想法/帮助。

【问题讨论】:

【参考方案1】:

最好的折衷方案似乎是在导入时重命名:

import package.module as mod

mod.function(param)

键入三个字母应该足够短。同时导入是合格的,不会像* 导入那样污染你的全局命名空间。 您可以为mod 使用任何名称。即使是一个字母的名字也可以。 但建议名称中至少包含三个字母。

【讨论】:

这确实是合乎逻辑的@MikeMüller,但是,如果我从模块和包中导入许多函数,导入语句可能会成倍增长。我想可以创建一个导入脚本来处理所有函数导入,然后简单地从主应用程序调用它,尽管我从未尝试过。如何处理可能有 50 多个导入的超大型应用程序? 你需要导入你需要的东西。无论您使用* 还是我的方法,您仍然需要相同数量的导入语句。 再次感谢@MikeMüller。我将如何创建一个包含我所有导入的文件,然后简单地从__main__.py 应用程序调用它?似乎这会清理主应用程序中的导入过程。 只需在每个模块中导入您真正需要的内容。这应该会大大减少输入端口的数量。 还有from package import module,如果模块名足够唯一的话。 (当然,这种导入方式仍然支持 as 别名语法。)

以上是关于如何使包模块中的函数立即可用于 Python3 中的根应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Python3中__init__.py文件介绍

python3-itertools模块和迭代器函数

python函数总结

python3中的os.path模块

python3中的 zip()函数 和python2中的 zip()函数 的区别

python3语法学习第五天--函数