蟒蛇打字:是否可以指定一个变量晚于在其创建的类型?

问题描述:

我知道,这是可能的,当它们被作为函数参数(以下: Header)或它们被创建(与# type:指令)当传递来指定的变量类型。蟒蛇打字:是否可以指定一个变量晚于在其创建的类型?

但是,它可以指定,在代码(一个if块内典型的)的中间,什么是所期望的类型的变量?

例如,在下面的函数,我想指定我的变量是Header一个特定的子类的,以避免PyCharm警告“未解决属性参考‘单元’类‘标题’”:

def change_header(old_header: Header, new_header: Header) 
    if old_header.is_measure: 
     # I would like to specify here that both old_header and 
     # new_header are of the subclass MeasureHeader and therefore have    
     # a 'unit' property 
     if new_header.unit != old_header.unit: 
      raise Exception("flag 'all' can't change the unit" 

谢谢。

+1

PyCharm确实有点:你指定你想依赖'Header'的类型规范,所以你应该只尝试使用'Header'中可用的内容。你应该改变你的类型提示来扩展它,可能是'Union [Header,MeasureHeader]'。 – deceze

PyCharm将认识isinstance检查:

def change_header(old_header: Header, new_header: Header) 
    if isinstance(old_header, MeasureHeader) and \ 
      isinstance(new_header, MeasureHeader): 
     ... 

你也可以用assert散布这样的isinstance。其他可能性列于PyCharm help

最后你能兑现自己的类型更加紧密地暗示,实际上坚持只在您的函数签名,声明类型,在这种情况下可能意味着加宽型提示:

from typing import Union 

def change_header(old_header: Union[Header, MeasureHeader], ...):