Python 使用静态类型标注时的循环导入问题

2021-01-27 07:00:59 +08:00
 LeeReamond

一般来说,包设计中做抽象时,个人习惯把基类抽出来单独放一个文件,我看很多其他人也喜欢这么做,比如做成这样

--鸟类大全\
    |___ base.py
    |___ 鸟人 1.py
    |___ 鸟人 2.py
    |___ 工具箱.py 

大概这种感觉。

最近在做 type hints 时遇到一个循环导入的问题,即比如我有一个 class BaseBird:存在于base.py中,而class BirdmanOne(BaseBird)存在于鸟人 1.py中,显然鸟人 1.py 需要from .base import BaseBird

正常情况下没问题,在老版本里也一直是这么处理的。但是现在如果想引入类型提示特性的话,如果BaseBird中的某个方法,或者base.py中的其他函数、方法的输入,是存在于其他文件中的子类,这种情况下没办法直接从子类导入这种类,因为会变成循环引用。

有办法解决吗?

3350 次点击
所在节点    Python
22 条回复
maocat
2021-01-29 09:25:07 +08:00
@LeeReamond 你好,你是怎么解决的呢
LeeReamond
2021-01-29 20:38:20 +08:00
@maocat

笼统地说实际代码层没有修改。解决的是指确实可以通过 runtime 的方式获取实例,也就是指虽然在同一个包内无法循环导入,但在用户代码执行的时候实际上所有内容都已经导入到用户空间,可以通过字符串转换到对应的类实例,也就是说如果想要的话是可以在 runtime 强行获取实例并进行某种校验的。但是研究了一下觉得并没有那么强的需求,所以最后也没改什么。楼上提到 PEP563 的导入方式,我测试下 mypy 是支持解释的,不愿意用 mypy 的话也有一些自己实现的方法,意思是你用 pep563 的方式进行导入,用自动工具是可以与普通导入等同地进行校验测试的,功能上来说已经达到了,虽然易用性上未必好

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/748739

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX