Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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.x_Type Hinting - Fatal编程技术网

Python 类型批注中未定义名称

Python 类型批注中未定义名称,python,python-3.x,type-hinting,Python,Python 3.x,Type Hinting,我目前正致力于创建一个python线性代数模块,以获得乐趣并练习该语言。我最近尝试向模块添加类型注释,如下所示: class Vector: # Various irrelevant implementation details def __add__(self, other: Vector) -> Vector: # More implementation details.... 但是,当我尝试导入此内容时,它会抛出一个NameError:未定义名称

我目前正致力于创建一个python线性代数模块,以获得乐趣并练习该语言。我最近尝试向模块添加类型注释,如下所示:

class Vector:
     # Various irrelevant implementation details
     def __add__(self, other: Vector) -> Vector:
        # More implementation details....
但是,当我尝试导入此内容时,它会抛出一个
NameError:未定义名称“Vector”
。我承认这个问题已经以某种形式得到了回答,但它似乎并没有完全为我的情况提供答案

我想知道的是:

  • 我已经在这个文件中定义了这个类。为什么它说这个名字没有定义
  • 如何定义
    向量
    ,使其可用于注释(作为
    类型

    • 您有一份远期申报;函数(绑定为方法)是在类创建之前创建的,因此名称
      Vector
      还不存在。只有在执行了所有的类主体之后,Python才能创建
      对象,并将名称
      向量
      绑定到该对象

      只需使用名称为的字符串即可:

      class Vector:
           # Various irrelevant implementation details
           def __add__(self, other: 'Vector') -> 'Vector':
              # More implementation details....
      
      这不会影响IDE如何看待声明;加载整个模块后,将查找字符串,并将其解析为当前上下文中的有效Python表达式。由于类
      向量
      一旦加载整个模块就存在,因此字符串
      向量
      可以正确地转换为类对象

      另见:

      当类型提示包含尚未定义的名称时,该定义可以表示为字符串文字,稍后解析

      [……]

      字符串文本应该包含一个有效的Python表达式[…],并且在模块完全加载后,它的计算应该不会出错

      从Python3.7开始,通过在模块顶部添加
      from\uuuuuu future\uuuuuuuu import annotations
      指令,可以使给定模块中的所有注释的行为类似于正向注释(而不将它们包含在字符串文本中)。在Python3.10及更高版本中。看见请注意,在注释之外,您可能仍然需要使用前向引用语法(字符串文字),例如在类型别名中(就Python而言,这是一个常规变量赋值)。

      如果您使用的是Python 3.7及更高版本。看看

      从Python 3.7开始,它将被允许,只需添加:

      from __future__ import annotations
      
      还要注意的是

      它将成为Python 3.10中的默认值


      请将您的帖子限制为每篇帖子一个问题。这里有两个不同的问题,一个是关于循环依赖关系(类的方法取决于创建之前的类),另一个是关于类型和类之间的区别。后者是重复的。请看我从你的帖子中删除的问题部分。对不起。我认为类型问题与手头的问题有关。谢谢。我在链接的问题中看到了字符串答案,但让我感到不舒服的是,它突出显示了带有类颜色的
      other:Vector
      ,而不带类颜色的
      ->Vector
      ,因此,当我对后一个向量进行注释时,我从不认为我需要为前者这样做。谢谢你的澄清。这很有趣。我将保留原样的答案,因为它适用于所有3.x版本(或者至少比
      导入注释
      解决方案更适用于3.x版本),但我仍然很高兴您将其发布在这里。请确保您将此行作为模块中的第一行输入。@VladBezden确定,正如pep8所建议的:导入位于文件的顶部,未来的导入将首先进行。对于Python3.6,我发现错误
      未定义未来功能注释
      @ShitalShah是的,因为正如答案中所说,这是Python3.7.x-4.0的一个功能。