python 键入:是否可以在创建变量之后指定变量的类型?
python typing: Is it possible to specify the type of a variable later than at its creation?
我知道当它们作为函数参数传递时(下面的: Header
)或者当它们被创建时(使用# type:
指令)可以指定变量类型。
但是是否可以在代码中间(通常在 if
块内)指定变量的预期类型?
例如在下面的函数中,我想指定我的变量是 Header
的特定子类以避免 PyCharm 警告 "Unresolved attribute reference 'unit' for class 'Header'":
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):
...
您也可以在 isinstance
中穿插 assert
。 PyCharm help.
中列出了其他可能性
最后,您可以更严格地遵守您自己的类型提示,实际上只坚持您在函数签名中声明的类型,在这种情况下,这可能意味着扩大类型提示:
from typing import Union
def change_header(old_header: Union[Header, MeasureHeader], ...):
我知道当它们作为函数参数传递时(下面的: Header
)或者当它们被创建时(使用# type:
指令)可以指定变量类型。
但是是否可以在代码中间(通常在 if
块内)指定变量的预期类型?
例如在下面的函数中,我想指定我的变量是 Header
的特定子类以避免 PyCharm 警告 "Unresolved attribute reference 'unit' for class 'Header'":
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):
...
您也可以在 isinstance
中穿插 assert
。 PyCharm help.
最后,您可以更严格地遵守您自己的类型提示,实际上只坚持您在函数签名中声明的类型,在这种情况下,这可能意味着扩大类型提示:
from typing import Union
def change_header(old_header: Union[Header, MeasureHeader], ...):