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 · 2021-09-29 11:20:48 +08:00 · 3378 次点击
    这是一个创建于 1156 天前的主题,其中的信息可能已经有所发展或是发生改变。
    文件 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  
       2021-09-29 11:24:14 +08:00   ❤️ 1
    这和 typing 有什么关系么?除了标题我没看到任何 typing
    而且你这个
    文件 a import 文件 b,文件 b import 文件 a 。这个循环引用有什么问题么?
    ruanimal
        2
    ruanimal  
       2021-09-29 11:27:25 +08:00   ❤️ 2
    if typing.TYPE_CHECKING:from a import A
    plko345
        3
    plko345  
       2021-09-29 12:27:06 +08:00 via Android
    我也有这个疑问
    BBCCBB
        4
    BBCCBB  
       2021-09-29 12:39:35 +08:00   ❤️ 1
    现在简单用字符串..

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

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

    他警告他的, 只要不报错, 能运行, 就 O 了.
    BBCCBB
        14
    BBCCBB  
       2021-09-29 15:19:38 +08:00
    或者在这里不加 typing.
    15399905591
        15
    15399905591  
    OP
       2021-09-29 15:21:56 +08:00
    @BBCCBB 哈哈, 有一点代码洁癖, 看见提示就不爽
    BBCCBB
        16
    BBCCBB  
       2021-09-29 15:27:44 +08:00
    把警告关了 🐶
    Trim21
        17
    Trim21  
       2021-09-29 15:48:20 +08:00 via Android
    你要首先用 2 楼的办法引入 A,然后用字符串,就不有警告了。
    15399905591
        18
    15399905591  
    OP
       2021-09-29 16:54:44 +08:00
    @Trim21 2 楼的好像不行
    houzhiqiang
        19
    houzhiqiang  
       2021-09-30 15:25:26 +08:00
    我也是用 2 楼的方法
    vcfghtyjc
        20
    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
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5464 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 59ms · UTC 06:01 · PVG 14:01 · LAX 22:01 · JFK 01:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.