从一个模块中导入多个类的语法

4

我正在阅读一些代码,其中包含以下导入语句:

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
是的。否则你怎么能在一个导入语句中定义多个别名呢?from threading import local as t_local, Event as Harambe, Thread as Banana - Bakuriu
是的,我肯定!我认为整个Python社区也会持积极态度! - d-coder
3个回答

3

您可以在官方文档上查看此内容。这是导入语法的文档:

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子句中的名称,则使用该名称,否则使用属性名称

0

0
是的,这两种语法是等价的,也与以下语法等价:
from threading import (
   local as thread_local, 
   Event, 
   Thread
)

基于标题的回答:
从一个模块中导入多个类的语法。
from PyQt5.QtWidgets import (
  QWidget, 
  QLCDNumber,
  QSlider,
  QVBoxLayout, 
  QApplication)

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