问题描述
我有一个中等大小的项目,跨文件的对象之间有许多相互关系。我目前正在学习有关类型注释的信息,并且试图遍历我的项目并将其添加到任何可能的地方。
有时,这些类型注释必须引用尚未初始化的类,因此我使用from __future__ import annotations
来延迟解析引用。当引用的类出现在同一文件中,而不是出现在不同的文件中时,这确实满足了PyCharm的引用检查器的要求,在该文件中我希望通过循环导入来解析引用
我的测试包:Stem
和Leaf
我制作了一个最小的测试包,以尝试不同的解决方案。在此测试包中,我尝试实现一个简单的“茎叶”关系,其中Stem
引用了许多leaves
,而每个Leaf
都引用了其stem
。为此,我可以Leaf
导入Stem
,也可以Stem
导入Leaf
。尽管在两种情况下PyCharm的引用检查器都会对我大喊大叫,但这两种方法都确实满足了没有类型注释的PyCharm,并且它们也确实编译并运行了带有 类型注释的。
方法1:Leaf
导入Stem
"""test_circular_annotations/stem_then_leaf/stem.py"""
from __future__ import annotations
class Stem:
def __init__(self) -> None:
self.leaves: list[Leaf] = []
def __getitem__(self,index: int) -> Leaf:
return self.leaves[index]
if __name__ == '__main__':
stem = Stem()
"""test_circular_annotations/stem_then_leaf/leaf.py"""
from typing import Optional
from test_circular_annotations.stem_then_leaf.stem import Stem
class Leaf:
def __init__(self,stem: Optional[Stem] = None) -> None:
self.stem = stem
@property
def stem(self) -> Optional[Stem]:
return self._stem_
@stem.setter
def stem(self,value: Optional[Stem]) -> None:
self._stem_ = value
if value and self not in value.leaves:
value.leaves.append(self)
if __name__ == '__main__':
stem = Stem()
leaf = Leaf(stem)
assert stem is leaf.stem is stem[0].stem
会发生什么?
stem.py
和leaf.py
都成功执行,但是PyCharm在Leaf
中标记对stem.py
的引用,要求我从{{1}导入Leaf
}-当然会在运行时导致leaf.py
。
方法2:ImportError
导入Stem
Leaf
"""test_circular_annotations/leaf_then_stem/stem.py"""
from test_circular_annotations.leaf_then_stem.leaf import Leaf
class Stem:
def __init__(self) -> None:
self.leaves: list[Leaf] = []
def __getitem__(self,index: int) -> Leaf:
return self.leaves[index]
if __name__ == '__main__':
stem = Stem()
leaf = Leaf(stem)
assert stem is leaf.stem is stem[0].stem
会发生什么?
同样,"""test_circular_annotations/leaf_then_stem/leaf.py"""
from __future__ import annotations
from typing import Optional
class Leaf:
def __init__(self,value: Optional[Stem]) -> None:
self._stem_ = value
if value and self not in value.leaves:
value.leaves.append(self)
if __name__ == '__main__':
leaf = Leaf()
和stem.py
都成功执行,但是这次PyCharm在leaf.py
中标记了对Stem
的引用。
TL; DR
这是项目在PyCharm中的样子:
我觉得这只是PyCharm中的一个错误,但以防万一我先在此发布,因为这似乎是一个常见问题,在规范的Python解决方案中可能只是“我的问题”。我真的不想将所有相关对象的集合都放在同一个文件中-考虑到可以在选择和省略类型注释之间进行选择,我肯定会选择后者。
我该怎么办?在此先感谢:)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)