1 回答

TA贡献1835条经验 获得超7个赞
只要您使用的是 Python 3.6+,就可以使用与在不初始化变量的情况下用于“声明”变量类型的相同语法任意地“重新注释”变量的类型(PEP 526)。
在您提供的示例中,以下代码段具有您期望的行为:
def do_something_to_A(a_in: A):
...
if a_in.is_b:
a_in: B
a_in.flummox()
我已经测试了PyCharm 2019.2是否正确检测到了这种技术。
值得注意的是,这不会产生运行时成本,因为无论是否添加此注释语句,都会生成相同的字节码。鉴于以下定义,
def do_something_with_annotation(a_in: A):
if a_in.is_b:
a_in: B
a_in.flummox()
def do_something_without_annotation(a_in: A):
if a_in.is_b:
a_in.flummox()
dis 产生以下字节码:
>>> dis.dis(do_something_with_annotation)
3 0 LOAD_FAST 0 (a_in)
2 LOAD_ATTR 0 (is_b)
4 POP_JUMP_IF_FALSE 14
5 6 LOAD_FAST 0 (a_in)
8 LOAD_ATTR 1 (flummox)
10 CALL_FUNCTION 0
12 POP_TOP
>> 14 LOAD_CONST 0 (None)
16 RETURN_VALUE
>>> dis.dis(do_something_without_annotation)
3 0 LOAD_FAST 0 (a_in)
2 LOAD_ATTR 0 (is_b)
4 POP_JUMP_IF_FALSE 14
4 6 LOAD_FAST 0 (a_in)
8 LOAD_ATTR 1 (flummox)
10 CALL_FUNCTION 0
12 POP_TOP
>> 14 LOAD_CONST 0 (None)
16 RETURN_VALUE
作为旁注,您还可以保留断言语句,并通过调用带有标志的解释器在生产环境中禁用断言。您的同事可能会或可能不会认为这更具可读性,具体取决于他们对Python中类型提示的熟悉程度。-O
添加回答
举报