推荐学习书目
› 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 · Sep 29, 2021 · 4927 views
    This topic created in 1860 days ago, the information mentioned may be changed or developed.
    文件 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 replies  •  2021-10-12 03:25:58 +08:00
    deplivesb
    deplivesb
    Sep 29, 2021❤️1
    1
    这和 typing 有什么关系么?除了标题我没看到任何 typing
    而且你这个
    文件 a import 文件 b,文件 b import 文件 a 。这个循环引用有什么问题么?
    ruanimal
    ruanimal
    Sep 29, 2021❤️2
    2
    if typing.TYPE_CHECKING:from a import A
    plko345
    plko345
    Sep 29, 2021 via Android
    3
    我也有这个疑问
    BBCCBB
    BBCCBB
    Sep 29, 2021❤️1
    4
    现在简单用字符串..

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

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

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

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

    class B:
    def func(self, a: "A"):
    pass
    ```
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1430 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 22:03 · PVG 06:03 · LAX 14:03 · JFK 17:03
    ♥ Do have faith in what you're doing.