Python 使用 typing 导致的循环引入问题

2021-09-29 11:20:48 +08:00
 15399905591
文件 a:
from b import B

class A:
def func(self, b: B):
pass


文件 b:
from a import A
class B:
def func(self, a: A)


像上面结构导致的循环引入问题, 应该怎么处理呢?
3100 次点击
所在节点    Python
20 条回复
deplivesb
2021-09-29 11:24:14 +08:00
这和 typing 有什么关系么?除了标题我没看到任何 typing
而且你这个
文件 a import 文件 b,文件 b import 文件 a 。这个循环引用有什么问题么?
ruanimal
2021-09-29 11:27:25 +08:00
if typing.TYPE_CHECKING:from a import A
plko345
2021-09-29 12:27:06 +08:00
我也有这个疑问
BBCCBB
2021-09-29 12:39:35 +08:00
现在简单用字符串..

from a import A
class B:
def func(self, a: 'A')

typing 用字符串包裹.
qs
2021-09-29 14:21:06 +08:00
a.py
from __future__ import annotations

import b

class A:
def func(self, b: b.B):
pass


b.py
from __future__ import annotations

import a

class B:
def func(self, a: a.A):
pass
qW7bo2FbzbC0
2021-09-29 14:58:24 +08:00
很久之前也遇到这个问题,后面改层级和归属解决了。在 go 里面也也遇到同样的问题
DaguguJ
2021-09-29 14:58:28 +08:00
from import 会导致,局部 import 就不会导致了。感兴趣看看两者的区别。然后,出现这个问题应该是编码不规范,代码不应该这么写的。
15399905591
2021-09-29 15:00:59 +08:00
@BBCCBB 用字符串的话,pycharm 会报警告,不知道为什么

Unresolved reference 'SpecicalDetailValueObject'
Inspection info: This inspection detects names that should resolve but don't. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases. Top-level and class-level items are supported better than instance items.
15399905591
2021-09-29 15:01:58 +08:00
@qs 你这个应该是 3.7 的新特性, 我用的 3.6, 用不了
15399905591
2021-09-29 15:04:21 +08:00
@hjahgdthab750 你那个是因为模块层级有问题,破坏了依赖倒置原则。 但我的代码是同一级, 类似 ORM 的 外关联关系, 两个 model 是在同一级的不同文件下面。
15399905591
2021-09-29 15:05:31 +08:00
@DaguguJ 你这个应该是 python 2.x 的解决方式,python3.x 没用
15399905591
2021-09-29 15:07:15 +08:00
@zhangdeplives 兄弟,typing 是指参数类型提示, 另外,这个循环有没有问题,你可以自己去试试
BBCCBB
2021-09-29 15:19:11 +08:00
> 用字符串的话,pycharm 会报警告,不知道为什么

他警告他的, 只要不报错, 能运行, 就 O 了.
BBCCBB
2021-09-29 15:19:38 +08:00
或者在这里不加 typing.
15399905591
2021-09-29 15:21:56 +08:00
@BBCCBB 哈哈, 有一点代码洁癖, 看见提示就不爽
BBCCBB
2021-09-29 15:27:44 +08:00
把警告关了 🐶
Trim21
2021-09-29 15:48:20 +08:00
你要首先用 2 楼的办法引入 A,然后用字符串,就不有警告了。
15399905591
2021-09-29 16:54:44 +08:00
@Trim21 2 楼的好像不行
houzhiqiang
2021-09-30 15:25:26 +08:00
我也是用 2 楼的方法
vcfghtyjc
2021-10-12 03:25:58 +08:00
@15399905591 补充一下二楼的方法

```
if typing.TYPE_CHECKING:
from a import A

class B:
def func(self, a: "A"):
pass
```

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

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

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

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

© 2021 V2EX