方便地从Python包中的模块导入几个类
我目前正在为语法树创建一个框架。我有一个文件夹/包方便地从Python包中的模块导入几个类,python,Python,我目前正在为语法树创建一个框架。我有一个文件夹/包syntax,其中包含一个语法树元素,它是每个文件中的一个类,结构如下所示: syntax/List.py -> contains class List syntax/Block.py -> contains class Block syntax/Statement.py -> contains class Statement 现在我想将文件夹导入到我的源文件中,这样我就可以访问如下类 block = syntax.Block
syntax
,其中包含一个语法树元素,它是每个文件中的一个类,结构如下所示:
syntax/List.py -> contains class List
syntax/Block.py -> contains class Block
syntax/Statement.py -> contains class Statement
现在我想将文件夹导入到我的源文件中,这样我就可以访问如下类
block = syntax.Block()
那有可能吗?到目前为止,我总是需要
syntax.Block.Block()
,这不是很好…最可读的处理方法是将您的导入到\uuu init\uuuuuuuuuy.py
文件中
例如:
# syntax/__init__.py
from syntax.List import List
from syntax.Block import Block
from syntax.Statement import Statement
# in your main file
from syntax import List
import syntax
b = syntax.Block()
注意:您还可以在\uuuu init\uuuu.py
文件中使用相对导入语法(例如从.List导入列表
)
在执行导入时,定义一个变量。此变量包含导入的变量、常量、函数、类或任何您想要的内容 如果您将
从.List导入列表
到您的\uuuu init\uuuuuuuuuuuuuupy
文件中,那么您就是在引用类语法.List
的文件中定义变量列表
from syntax import List
from syntax.List import List as OriginList
List is OriginList # True
因此,当您尝试从syntax import List编写时,您正在尝试从\uuu init\uuuuuuuuuuupy
文件导入变量List
,该文件指向syntax.List.List
from syntax import List
from syntax.List import List as OriginList
List is OriginList # True
项目结构
syntax
├── Block.py
├── __init__.py
班级
# syntax/Block.py (this file really ought to be lowercase, leave PascalCase to class names)
class Block(object):
pass
在\uuuu init\uuuuu中导入
# syntax/__init__.py
from .Block import Block # Relative import with .
使用包
In [5]: import syntax
In [6]: b = syntax.Block()
In [7]: b
Out[7]: <syntax.Block.Block at 0x108dcb990>
然后可以使用如下
import syntax
b = syntax.Block()
l = syntax.List()
语法导入列表中的“”行是否正确?在这种情况下,类语法.List
和模块语法.List
之间可能会产生混淆。他真的应该将模块名保持小写(在List.py中有类List,而不是List.py)。然而,也许这不是一个好的解决方案。你怎么看?这是一种正常的方法,除了把三个类放在一个syntax.py中,而不用麻烦把它们分成三个模块,这可能是最正常的。你真的应该保持模块名称的小写。这是实现这一点的标准方法,并且不会在类和模块之间产生混淆。