我正在使用 Python 3.3.2 编写一个封装文件系统的包。我的项目如下所示:
~/
python/
filesystem/
__init__.py
file.py
directory.py
与PYTHONPATH=~/python
.
问题是,file.py
需要directory.py
(例如, for File.get_directory()
)和directory.py
需要file.py
(例如, for Directory.get_files()
),所以我有一个循环导入。
- 当我使用
import directory
infile.py
和import file
in 时directory.py
,它仅在我的工作目录为filesystem
(即,当导入为本地时)时才有效。 - 当我使用
import filesystem.directory
infile.py
和import filesystem.file
in 时directory.py
,它工作得很好,除了写作filesystem.file.File
和filesystem.Directory.directory
所有时间的审美滋扰。 - 奇怪的是,当我使用
import filesystem.directory as directory
or时from filesystem.directory import Directory
,我得到了循环导入错误'module' object has no attribute 'directory'
。我的猜测是 whileimport ...
是懒惰的,import ... as
并from ... import
尝试评估模块并立即注意到循环性。 - 解决这个问题的一种方法是
import filesystem.directory
在使用它的函数内部。不幸的是,我的许多方法都使用它,并且在类中导入它似乎不起作用。
当然,这是可以解决的:吸收它并写作filesystem.directory.Directory
;在方法中分配__import__
一个全局变量以__init__
供所有其他方法使用;定义File
和Directory
在同一个文件中;等等。但这些妥协多于解决方案,所以我的问题仍然存在:
- 您将如何设计文件系统,其中文件类使用目录类,反之亦然?
- 更一般地说,您将如何处理(或避免)循环进口?
谢谢。
更新 [03.07.2013](主要是为了讨论)
我遇到的另一个解决方案是某种前向声明,在一个公共标头中包含空file
和directory
类,然后是单独的实现(更像是属性添加)。虽然最终的设计非常简洁,但这个想法比 Pythonic 更接近 C++。