from ... import或import ...对于模块

时间:2014-03-07 09:05:15

标签: python import module

我应该使用

from foo import bar

OR

import foo.bar as bar

导入模块并且不需要/希望更改名称bar)?

有什么不同吗?这有关系吗?

6 个答案:

答案 0 :(得分:36)

假设barfoo中的模块或包,没有区别,没关系。这两个陈述的结果完全相同:

>>> import os.path as path
>>> path
<module 'posixpath' from '/Users/mj/Development/venvs/stackoverflow-2.7/lib/python2.7/posixpath.pyc'>
>>> from os import path
>>> path
<module 'posixpath' from '/Users/mj/Development/venvs/stackoverflow-2.7/lib/python2.7/posixpath.pyc'>

如果bar不是模块或包,则第二种形式不起作用;引发回溯:

>>> import os.walk as walk
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named walk

答案 1 :(得分:15)

两者在技术上有所不同:

  • import torch.nn as nn导入模块/程序包torch.nn,其中
  • from torch import nn可以并且愿意从.nn模块/包中导入属性torch。导入模块/软件包torch.nn是一个回退。

在实践中,具有相同的完全限定名称引用两个独立的东西是不好的风格。因此,torch.nn仅应引用模块/软件包。在这种常见情况下,两个import语句在功能上都是等效的:导入相同的对象并将其绑定到相同的名称。

如果目标始终是模块,则可以选择哪个优先级。重构时存在实际差异:

  • import torch.nn as nn保证.nn是一个模块/程序包。它可以防止带有属性的意外阴影。
  • from torch import nn不在乎.nn是什么。它允许透明地更改实现。

7.11. The import statement

基本导入语句(没有 from 子句)通过两个步骤执行:

  1. 找到一个模块,并在必要时加载并初始化
  2. 在本地名称空间中为该名称定义一个或多个名称 import 语句出现的范围。

[...]

from 表单使用的过程稍微复杂一些:

  1. 找到from子句中指定的模块,并在必要时加载并初始化它;

  2. 对于导入子句中指定的每个标识符:

    1. 检查导入的模块是否具有该名称的属性
    2. 如果不是,请尝试导入具有该名称的子模块,然后再次检查导入的模块中的该属性

答案 2 :(得分:11)

我唯一能看到的第二个选项就是你需要输入与你要导入的东西一样多的行。例如 :

import foo.bar as bar
import foo.tar as tar
import foo.zar as zar

而不是简单地做:

from foo import bar, tar, zar

答案 3 :(得分:9)

您可以使用作为重命名模块,假设您有两个包含视图的应用,并且您想要导入它们

from app1 import views as views1
from app2 import views as views2

如果您想要多次导入,请使用逗号分隔

>>> from datetime import date as d, time as t
>>> d
<type 'datetime.date'>
>>> t
<type 'datetime.time'>

答案 4 :(得分:7)

这是一个迟来的答案,源于what is the difference between 'import a.b as b' and 'from a import b' in python

此问题已被标记为重复,但是两种机制之间存在重要差异,而其他机制尚未解决。

from foo import bar将名为bar任何对象从命名空间foo导入当前命名空间。

import foo.bar as bar导入名为foo.bar的可导入对象(包/模块/命名空间),并为其赋予别名bar

有什么区别?

获取一个名为foo的目录(包),其中的__init__.py包含:

# foo.__init__.py
class myclass:
    def __init__(self, var):
        self.__var = var

    def __str__(self):
        return str(self.__var)

bar = myclass(42)

与此同时,foo中还有一个 模块,名为bar.py

from foo import bar
print(bar)

礼物:

42

位置:

import  foo.bar as bar
print(bar)

礼物:

<module 'foo.bar' from '/Users//..../foo/bar.py'>

因此可以看出import foo.bar as bar更安全。

答案 5 :(得分:2)

import modulefrom module import之间的区别主要是主观的。选择最喜欢的一个,并在使用中保持一致。两者都有一些优点,可以帮助您做出决定。

进口优势

  1. 更少维护您的导入语句。
  2. 无需添加任何其他导入即可开始使用模块中的另一项

从火炬进口nn的优势

  1. 输入较少以使用nn
  2. 进一步控制可以访问模块的哪些项目