在Python中,“import foo.bar as bar”和“from foo import bar”的区别是什么?

3

我在PyTorch和Matplotlib中看到了这种约定:

import torch.nn as nn
import torch.optim as optim

import matplotlib.pyplot as plt

为什么要将整个路径(module.submodule)作为别名导入,而不只是导入子模块?如果像这样导入有什么区别:

from torch import nn
from torch import optim

from matplotlib import pyplot as plt

编辑: 对于通用情况:

import foo.bar as bar    # [1]
from foo import bar      # [2]

是否存在能够引用bar并且在使用[1]时可以运行但使用[2]时不行(反之亦然)的代码?也就是说,这两种导入方式之间是否存在功能上的区别?


1
对于列出的示例,可能没有太大区别。我看到“as”使用的地方是当您想要使用较短名称时。最常见的例子是“import numpy as np”,尽管您提到的“plt”也很常见。 - Mark Ransom
2个回答

4

在幕后,所有的导入语句本质上都映射到内置的__import__函数,例如:

import torch.nn as nn

变成

nn = __import__("torch.nn", globals(), locals(),  [], 0)

同样地:
from torch import nn

成为

nn = __import__("torch", globals(), locals(), ["nn"], 0)

微妙地有所不同,但在功能上是等效的。

参考: https://docs.python.org/3/library/functions.html#import


0

import blank as blank 允许您在整个程序中使用该名称引用模块。

from blank import blank 从模块导入特定的方法、函数和类。


我不认为这回答了我的问题。我在询问import a.b as bfrom a import b as b之间的功能区别。是否存在一种情况,当它引用b时,某些代码将在前者中运行而不是后者中运行? - hazrmard
使用 from a import b as c 语句可以将一个特定的函数、方法、类等导入,并赋予其一个新的名称。 - Holden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接