【问题标题】:What are the ways to import a module/function?导入模块/功能的方法有哪些?
【发布时间】:2019-05-13 08:03:59
【问题描述】:

这是一个非常基本的问题,但到目前为止我还没有看到任何涵盖所有可能情况的解释。

假设m1, m2, m3 是模块层次结构,fun() 是层次结构中的一个函数。

我见过类似的命令

版本 1

from m1.m2.m3 import fun
fun() #To access the function

版本 2

import m1
m1.m2.m3.fun()

它们是否完全等同于

版本 3

import m1.m2
m1.m2.m3.fun()

版本 4

from m1.m2 import m3
m3.fun()

或者两者之间的任何其他组合?有没有相对的优势或劣势?显然,我宁愿每次调用函数时都写fun(),而不是写m1.m2.m3.fun(),但有什么权衡呢?
据我了解,版本 2 将执行 m1 的整个脚本。但是其他人在执行时是否更有选择性(因此可能会更快地到达__main__?)

【问题讨论】:

  • 很大程度上取决于您是否要使用软件包的其他部分。例如,如果您只想使用fun(),那么您应该只导入它,而不是导入整个m1
  • 另一种选择是将from .m2.m3 import fun 添加到m1__init__ 文件中,并将fun 导入为from m1 import fun

标签: python function main python-module


【解决方案1】:

版本 1

from m1.m2.m3 import fun
fun() #To access the function

版本 1 是与 如果 fun 是您想要从 m1 树中获得的唯一功能并且您可以保证内部没有其他功能的唯一功能您的脚本将被称为fun。如果不满足上述任何一项不要这样做,但如果满足,请这样做。


版本 2

import m1
m1.m2.m3.fun()

版本 2 与 如果 您希望能够访问 m1 中的所有内容 相匹配。它确实会导致更冗长的代码,因为您必须一直随身携带m1,但它比等效的(应该不鼓励)from m1 import * 更安全且不那么晦涩难懂。请注意,m1 代码将被执行。


版本 3

import m1.m2
m1.m2.m3.fun()

版本 3 与 如果 您希望能够访问 m2 内的所有内容,但不能访问更高版本(不能做到 m1.more_fun())。注意m2代码会被执行。


版本 4

from m1.m2 import m3
m3.fun()

版本 4 与 如果 您希望能够访问 m3 内的所有内容,但不能访问更高版本(不能这样做 m1.m2.more_fun())。请注意,m3 代码将被执行。

【讨论】:

  • 谢谢。在选择性执行方面有什么区别还是在继续执行'main'之前它们都执行了整个m1?
  • @Della 有。当你执行import m1.m2 时,m1 代码不会被执行; m2 是。 from m1 import m2 也是如此。我将编辑答案。
【解决方案2】:

另一种导入方式是

import m1.m2.m3 as m

因此你可以调用函数使用

m.fun()

要注意的最重要的事情是不要覆盖已经存在的东西(污染命名空间)

【讨论】:

    猜你喜欢
    • 2021-12-18
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 2019-05-02
    • 2010-11-13
    • 1970-01-01
    相关资源
    最近更新 更多