2016-10-04 34 views
0

我读了一些代码,其中包含以下import语句:语法从一个模块中导入多个类

from threading import local as thread_local, Event, Thread 

起初,这句法困扰了我,但我认为这等同于:

from threading import local as thread_local 
from threading import Event 
from threading import Thread 

任何人都可以确认是否是这种情况?

+1

是。否则,如何在导入中定义多个别名? '从本地线程导入t_local,事件为Harambe,线程为Banana'。 – Bakuriu

+0

是的,我很积极!我认为整个Python社区也将是积极的! –

回答

2

您可以在官方文档中查看。这里的documentation for the import syntax

import_stmt  ::= "import" module ["as" name] ("," module ["as" name])* 
        | "from" relative_module "import" identifier ["as" name] 
        ("," identifier ["as" name])* 
        | "from" relative_module "import" "(" identifier ["as" name] 
        ("," identifier ["as" name])* [","] ")" 
        | "from" module "import" "*" 
module   ::= (identifier ".")* identifier 
relative_module ::= "."* module | "."+ 
name   ::= identifier 

注意你怎么总是有import module ["as" name]identifier ["as" name],包括在列表定义:

("," identifier ["as" name])* 

这意味着一个逗号,后跟标识符,可选分配as为一个名字,)*表示“这个组可以重复零次或多次,其中包括您提供的示例。”

这是在同一页上还解释了一下后上:

from形式使用一个稍微复杂的过程:

  1. 发现在from条款,加载指定的模块必要时初始化;
  2. 每个在进口子句指定的标识符:
    1. 检查,如果导入的模块有这个名字的属性
    2. 如果没有,尝试导入一个子模块具有该名称,然后检查导入的模块再次针对该属性
    3. 如果未找到该属性,则会引发ImportError
    4. 否则,为该值的引用存储在本地名称空间中,as子句中使用的名称,如果它存在,否则 使用属性名称
相关问题