Python2.7中属性注解报语法错误,如何实现类似功能?
在Python 2.7中实现类似属性注解的功能
Python 2.7不支持Python 3.6+引入的变量注解语法(var: int这种写法),直接编写会触发SyntaxError。要实现类似的类型标注或校验功能,可以试试下面几种方法:
1. 注释标注(最简单的文档层面方案)
如果只是想给代码加类型说明,供阅读或文档工具识别,直接用注释标注就行,这是最省事的方式:
class base: # var: int 用注释标注该属性预期类型为int def __init__(self): self.var = None
2. 手动维护__annotations__字典
Python 3的注解本质是把类型信息存在类/实例的__annotations__字典里,Python 2.7虽然没有语法糖,但可以手动创建这个字典来存储类型信息:
class base: pass # 给类属性添加类型注解 base.__annotations__ = {'var': int} # 如果是实例属性,也可以在初始化时处理 class base2: def __init__(self): self.var = 0 # 初始化实例的注解字典 self.__annotations__ = {'var': int}
这种方式能模拟注解的存储结构,部分依赖__annotations__的工具可能能识别到。
3. 使用第三方库实现带校验的类型标注
如果需要实际的类型校验功能,可以用支持Python 2.7的第三方库,比如attrs(注意要安装适配2.7的版本,比如pip install attrs<=19.2.0):
import attr @attr.s class base(object): # 定义字段并指定类型,还能添加其他校验规则 var = attr.ib(type=int)
attrs不仅能帮你标注类型,还可以自动生成__init__、__repr__等方法,开启校验后还能在赋值时检查类型是否符合要求。
4. 自定义描述符实现类型校验
如果不想依赖第三方库,可以自己写描述符类来模拟类型注解的校验逻辑:
class TypeChecker(object): def __init__(self, expected_type): self.expected_type = expected_type self.attr_name = None def __get__(self, instance, owner): if instance is None: return self return instance.__dict__.get(self.attr_name, None) def __set__(self, instance, value): if not isinstance(value, self.expected_type): raise TypeError("属性%s必须是%s类型" % (self.attr_name, self.expected_type)) instance.__dict__[self.attr_name] = value # 定义类时手动给描述符指定属性名(因为Python2.7不支持__set_name__) class base(object): var = TypeChecker(int) var.attr_name = 'var' # 使用示例 b = base() b.var = 123 # 正常赋值 b.var = "test" # 抛出TypeError
这种方式能实现严格的类型校验,完全自定义规则。
内容的提问来源于stack exchange,提问作者structuralengin
相关产品推荐
相关产品推荐

