Python3.4类成员类型注解引发SyntaxError报错求助(相机 resectioning场景)
解决Python 3.4中类变量类型注解的语法错误
这个报错的核心原因很明确:Python 3.4不支持你使用的类变量类型注解语法,这种变量名: 类型的写法是PEP 484在Python 3.5才正式引入的特性,3.4版本完全不兼容。另外你定义Point和PointWithCorrespondence的方式也不符合类型注解的规范,我来一步步帮你解决:
问题拆解
- 类型注解版本不兼容:
_pointsPerFrame : [[PointWithCorrespondence]]这种写法是Python 3.5+才支持的类变量类型标注,3.4会直接判定为语法错误。 - 类型别名定义错误:你用
Point = (float, float)的方式试图定义类型别名,但这在Python里只是创建了一个普通元组,不是类型提示,正确的类型别名需要用typing模块的Tuple来定义(同样,typing模块是Python 3.5才内置的,3.4需要手动安装)。
解决方案
方案1:升级到Python 3.5+(推荐)
Python 3.4已经停止维护多年,升级到更高版本不仅能解决这个问题,还能获得更多新特性和安全更新。修正后的代码如下:
from typing import Tuple, List class PointsCorrespondence: """ Stores the point of a specific index. """ # A point is represented as (coordinate X, coordinate Y) Point = Tuple[float, float] # A point with corresponding same point is represented as (coordinates, index of the corresponding point or -1 if there is no corresponding point). PointWithCorrespondence = Tuple[Point, int] # Contains the points represented as one list of notable points for each frame. _pointsPerFrame : List[List[PointWithCorrespondence]] def __init__(self, pointsPerFrame : List[List[PointWithCorrespondence]]): self._pointsPerFrame = pointsPerFrame
方案2:保留Python 3.4的处理方式
如果必须使用3.4版本,有两种可选方式:
方式A:用注释替代类型注解
去掉代码中的类型标注语法,改用注释来说明类型:
class PointsCorrespondence: """ Stores the point of a specific index. """ # A point is represented as (coordinate X, coordinate Y) # Point format: (float, float) # A point with corresponding same point: ((float, float), int) # (int is index of corresponding point, -1 if no match) def __init__(self, pointsPerFrame): # pointsPerFrame: list[list[tuple[tuple[float, float], int]]] self._pointsPerFrame = pointsPerFrame
方式B:安装第三方typing模块实现类型提示
先通过pip安装兼容3.4的typing模块:
pip install typing
然后修改代码,用注释标注类型(因为3.4还是不支持类变量的: 类型写法):
from typing import Tuple, List class PointsCorrespondence: """ Stores the point of a specific index. """ # A point is represented as (coordinate X, coordinate Y) Point = Tuple[float, float] # A point with corresponding same point is represented as (coordinates, index of the corresponding point or -1 if there is no corresponding point). PointWithCorrespondence = Tuple[Point, int] def __init__(self, pointsPerFrame): # type: (List[List[PointWithCorrespondence]]) -> None self._pointsPerFrame = pointsPerFrame
内容的提问来源于stack exchange,提问作者Kamal El-Saaid
相关产品推荐
相关产品推荐

