蟒蛇打字:是否可以指定一个变量晚于在其创建的类型?
问题描述:
我知道,这是可能的,当它们被作为函数参数(以下: 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"
谢谢。
答
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], ...):
PyCharm确实有点:你指定你想依赖'Header'的类型规范,所以你应该只尝试使用'Header'中可用的内容。你应该改变你的类型提示来扩展它,可能是'Union [Header,MeasureHeader]'。 – deceze