(Python)为什么不在函数中而不是在开始时导入模块,以及导入模块的最佳方式?

(Python)为什么不在函数中而不是在开始时导入模块,以及导入模块的最佳方式?,python,function,import,module,Python,Function,Import,Module,我正在用python编写一个程序。我正在使用大约12个模块。目前,我已将它们放在函数本身中。我的理由是,由于用户不打算在一个会话中使用所有的函数,因此在函数需要它们之前,许多模块不必被无用地导入。但是到目前为止,我看到的所有代码一开始都有它们的导入。他们的理由和优势是什么 还有什么是最好的进口方式?我见过几种类型,如: 从tkinter导入*,然后标签(),Tk() 导入tkinter然后tkinter.Label(),tkinter.Tk() 将tkinter作为tk导入,然后tk.Label

我正在用python编写一个程序。我正在使用大约12个模块。目前,我已将它们放在函数本身中。我的理由是,由于用户不打算在一个会话中使用所有的函数,因此在函数需要它们之前,许多模块不必被无用地导入。但是到目前为止,我看到的所有代码一开始都有它们的导入。他们的理由和优势是什么

还有什么是最好的进口方式?我见过几种类型,如:

  • 从tkinter导入*
    ,然后
    标签()
    Tk()
  • 导入tkinter
    然后
    tkinter.Label()
    tkinter.Tk()
  • 将tkinter作为tk导入,然后
    tk.Label()

  • 最好的办法是什么?我看第一个是最短的。这也是最好的吗?

    我将尝试回答你问题的第二部分

  • 从tkinter导入*
    ,然后
    标签()
    Tk()
    这被认为是一种糟糕的做法,因为它混合了名称空间,并且可能会混淆代码的未来读者。例如,许多模块都有
    sqrt
    函数(标准库
    math
    numpy
    scipy
    )。如果对其中几个使用import all(
    *
    ),则最后一个将获胜。有时,模块中的函数会覆盖标准python函数,读者无法知道该特定函数的来源。即使只在一个模块上使用import all,读者也必须区分标准python函数和包函数,例如is
    getint
    from
    tkinter
    ?为什么他用
    NONE
    而不是
    NONE
    等等。。这只能用于口译员的交互工作

  • 导入tkinter
    然后
    tkinter.Label()
    tkinter.Tk()
    这是最明确的(请记住),但有点长

  • 将tkinter作为tk导入,然后
    tk.Label()
    ? 这是1和2之间的一个很好的折衷方案。简短但明确

  • 所以你必须在2和3之间做出决定。如果你经常使用这个软件包,并且它有一个清晰的短名称(例如
    tkinter->tk
    numpy->np
    ),我会使用这个短名称。

    @martijn pieters这个答案对于我问题的第一部分非常好。我认为回答问题的第一部分。但其第二部分仍然没有答案。我应该删除这个帖子并创建一个新的帖子或编辑帖子以只包含第二部分吗?我相信我在某个地方(effbot.org和那里的网页链接)读到tkinter被设计成从tkinter import*
    导入
    ,没有问题,但因为我找不到那个帖子,而且因为我读了很多其他反对导入的帖子,我接受你的答案。@love_in_dreams:没有办法设计任何python包以这种方式导入而不引起问题。将事物导入全球范围的本质总是有潜在的问题。Tkinter特别容易受影响,因为人们经常一起使用Tkinter和ttk,而且它们都有名为Button、Label等的类。多亏了你们两个。我想我们都太懒了,因为我没有看到很多人/例子使用正确的方法。对于生产代码来说,使用shortname似乎确实是最好的方法。