Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有导入类方法的Python类型提示_Python_Python 3.7_Python Typing - Fatal编程技术网

带有导入类方法的Python类型提示

带有导入类方法的Python类型提示,python,python-3.7,python-typing,Python,Python 3.7,Python Typing,为了将大型类拆分为多个文件,建议在class级别使用import命令加载其定义可以移动到其他模块的方法。作为一个简单的例子 class_def.py: C类: from\u方法导入m \u methods.py: defm(自): 回复“你好” 通常,大多数具有代码完成功能的IDE会将某些类中定义的函数识别为绑定方法,self会自动识别为具有定义该方法的类的类型。不幸的是,在上述情况下,我没有在类中定义m。仅仅通过查看\u methods.py就无法判断self应该具有类型C 在m的定义中,

为了将大型类拆分为多个文件,建议在
class
级别使用
import
命令加载其定义可以移动到其他模块的方法。作为一个简单的例子

class_def.py

C类:
from\u方法导入m
\u methods.py

defm(自):
回复“你好”
通常,大多数具有代码完成功能的IDE会将某些类中定义的函数识别为绑定方法,
self
会自动识别为具有定义该方法的类的类型。不幸的是,在上述情况下,我没有在类中定义
m
。仅仅通过查看
\u methods.py
就无法判断
self
应该具有类型
C

m
的定义中,如果我插入一行以
self.
开头,我的IDE不能建议
m
或我可能在
C
中实现的任何其他方法

显而易见的解决方案是添加一个类型提示:

from class_def import C

def m(self: C):
    return "hello"
但是现在我们有一个循环导入:
C
的定义导入了
\u方法
,但是
\u方法
导入了
C
。如何在不引入循环导入的情况下创建类型提示

我目前正在使用Python3.7,但我也对需要更高版本的解决方案感兴趣

  • 通过使用
    键入来修复循环导入。键入\u CHECKING
    标志以仅在类型检查期间导入
    C

  • 这使得
    C
    的值在运行时未定义。将其括在引号中(
    “C”
    )或导入
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuu。注释

  • \u方法.py
    变体1:

    来自输入导入类型检查
    如果类型_检查:
    从class_def导入C
    定义m(自我:“C”):
    回复“你好”
    
    \u methods.py
    变体2:

    from\uuuuu future\uuuuu导入注释
    从键入导入类型检查
    如果类型_检查:
    从class_def导入C
    def m(自我:C):
    回复“你好”
    
    如果一个类变得那么大,您必须将其拆分,那么您的设计中很有可能存在次优的情况。我建议花些时间进行重构。我发现很难想象有比这更理想的方法来重构一个代表一个应该具有大量功能的对象的大型类。但这可能是我的无知(我不是程序员)。这能回答你的问题吗@乔治,差不多了。我认为下面的答案回答了这个问题。