我正在阅读一些代码,其中包含以下导入语句:
from threading import local as thread_local, Event, Thread
一开始,这种语法让我很困惑,但我认为它等同于:
from threading import local as thread_local
from threading import Event
from threading import Thread
有人可以确认这是真的吗?
我正在阅读一些代码,其中包含以下导入语句:
from threading import local as thread_local, Event, Thread
一开始,这种语法让我很困惑,但我认为它等同于:
from threading import local as thread_local
from threading import Event
from threading import Thread
您可以在官方文档上查看此内容。这是导入语法的文档:
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
形式使用稍微复杂的过程:
- 查找在
from
子句中指定的模块,必要时加载和初始化它;- 对于在导入子句中指定的每个标识符:
- 检查导入的模块是否具有该名称的属性
- 如果没有,请尝试导入具有该名称的子模块,然后再次检查导入的模块以获取该属性
- 如果未找到该属性,则会引发
ImportError
。- 否则,将对该值的引用存储在本地命名空间中,如果存在
as
子句中的名称,则使用该名称,否则使用属性名称
是的,没错。
看看在Python中可以导入模块的所有方式: https://docs.python.org/2/reference/simple_stmts.html#the-import-statement
from threading import (
local as thread_local,
Event,
Thread
)
from PyQt5.QtWidgets import (
QWidget,
QLCDNumber,
QSlider,
QVBoxLayout,
QApplication)
from threading import local as t_local, Event as Harambe, Thread as Banana
。 - Bakuriu