在一个程序中以两种不同的方式导入同一个模块是否有意义?

Is there a point to import the same module in two different ways in a program?

是否有必要以通配符和非通配符方式导入,例如:

import spam as sp
from spam import *

非常相同的文件中?

当您将垃圾邮件导入为 sp 时,请确保与其他导入命令没有冲突:

import spam as sp
import myfunctions as my

sp.foo()
my.foo()

这按预期工作,但这不是:

from spam import *
from myfunctions import *


foo()
foo() #Which foo() is meant? UNCLEAR!!!

当您使用 import spam as sp 避免此问题时,为什么还要使用 from spam import *?我认为这没有任何意义。

没有。由于您导入了名称为 spspam,然后使用 from spam import * 导入了所有内容,因此永远不会使用 sp,因此没有必要。

例如,如果我们有一个名为 somefunction() 的函数。 import spam as sp 意味着我们可以用 sp.somefunction()

调用 somefunction()

既然from spam import *可以直接调用somefunction()为什么要用sp.somefunction()

from spam import * 被认为是非常糟糕的做法。您应该单独导入每个函数,而不是那样做。 (from spam import somefunctionfrom spam import someotherfunction 等等)。或者你可以只使用 sp.somefunction(), sp.someotherfunction().

我能想到的唯一原因是您想 from spam import * 更改为 import spam as sp。如果你只是替换这些行,它会立即破坏代码,你必须在所有内容前加上 sp. 前缀。如果您想以较慢的速度进行此更改,则可以这样做。然后你可以在需要的地方慢慢添加 sp. 并最终删除 from spam import *.

import spam as sp 会加载模块并将其放入变量spfrom spam import * 将加载模块及其所有属性(类、函数等),并且可以访问使用通配符导入到 spam 中的属性。

import * 是您需要访问大量 类 函数时的快捷方式。但这是一种不好的做法(cf PEP),因为您没有将导入的属性封装到命名空间中(这是您对 import spam as sp 所做的)并且可能导致不需要的行为(如果 2 个函数在您的主函数中具有相同的名称程序并进入垃圾邮件)

最佳实践,明确说明您将使用的是 from spam import func1, func2 或者如果您经常使用它 import spam as sp 并使用 sp.func1()