V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
15399905591
V2EX  ›  Python

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

  •  
  •   15399905591 · 60 天前 · 2208 次点击
    这是一个创建于 60 天前的主题,其中的信息可能已经有所发展或是发生改变。
    文件 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)


    像上面结构导致的循环引入问题, 应该怎么处理呢?
    20 条回复    2021-10-12 03:25:58 +08:00
    deplivesb
        1
    deplivesb   60 天前   ❤️ 1
    这和 typing 有什么关系么?除了标题我没看到任何 typing
    而且你这个
    文件 a import 文件 b,文件 b import 文件 a 。这个循环引用有什么问题么?
    ruanimal
        2
    ruanimal   60 天前   ❤️ 2
    if typing.TYPE_CHECKING:from a import A
    plko345
        3
    plko345   60 天前 via Android
    我也有这个疑问
    BBCCBB
        4
    BBCCBB   60 天前   ❤️ 1
    现在简单用字符串..

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

    typing 用字符串包裹.
    qs
        5
    qs   60 天前
    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
    hjahgdthab750
        6
    hjahgdthab750   60 天前
    很久之前也遇到这个问题,后面改层级和归属解决了。在 go 里面也也遇到同样的问题
    DaguguJ
        7
    DaguguJ   60 天前
    from import 会导致,局部 import 就不会导致了。感兴趣看看两者的区别。然后,出现这个问题应该是编码不规范,代码不应该这么写的。
    15399905591
        8
    15399905591   60 天前
    @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
        9
    15399905591   60 天前
    @qs 你这个应该是 3.7 的新特性, 我用的 3.6, 用不了
    15399905591
        10
    15399905591   60 天前
    @hjahgdthab750 你那个是因为模块层级有问题,破坏了依赖倒置原则。 但我的代码是同一级, 类似 ORM 的 外关联关系, 两个 model 是在同一级的不同文件下面。
    15399905591
        11
    15399905591   60 天前
    @DaguguJ 你这个应该是 python 2.x 的解决方式,python3.x 没用
    15399905591
        12
    15399905591   60 天前
    @zhangdeplives 兄弟,typing 是指参数类型提示, 另外,这个循环有没有问题,你可以自己去试试
    BBCCBB
        13
    BBCCBB   60 天前
    > 用字符串的话,pycharm 会报警告,不知道为什么

    他警告他的, 只要不报错, 能运行, 就 O 了.
    BBCCBB
        14
    BBCCBB   60 天前
    或者在这里不加 typing.
    15399905591
        15
    15399905591   60 天前
    @BBCCBB 哈哈, 有一点代码洁癖, 看见提示就不爽
    BBCCBB
        16
    BBCCBB   60 天前
    把警告关了 🐶
    Trim21
        17
    Trim21   60 天前 via Android
    你要首先用 2 楼的办法引入 A,然后用字符串,就不有警告了。
    15399905591
        18
    15399905591   60 天前
    @Trim21 2 楼的好像不行
    houzhiqiang
        19
    houzhiqiang   59 天前
    我也是用 2 楼的方法
    vcfghtyjc
        20
    vcfghtyjc   48 天前
    @15399905591 补充一下二楼的方法

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

    class B:
    def func(self, a: "A"):
    pass
    ```
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4163 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:45 · PVG 10:45 · LAX 18:45 · JFK 21:45
    ♥ Do have faith in what you're doing.