Skip to content

Commit da36cdc

Browse files
committed
spec: clarify Final reassignment semantics
1 parent fecce0d commit da36cdc

File tree

8 files changed

+193
-151
lines changed

8 files changed

+193
-151
lines changed

conformance/results/mypy/qualifiers_final_annotation.toml

Lines changed: 41 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8,41 +8,49 @@ Does not report modification of local Final variable via "for" statement.
88
output = """
99
qualifiers_final_annotation.py:16: error: Type in Final[...] can only be omitted if there is an initializer [misc]
1010
qualifiers_final_annotation.py:18: error: Final[...] takes at most one type argument [misc]
11-
qualifiers_final_annotation.py:34: error: Type in Final[...] can only be omitted if there is an initializer [misc]
12-
qualifiers_final_annotation.py:38: error: Final name must be initialized with a value [misc]
13-
qualifiers_final_annotation.py:54: error: Cannot assign to final attribute "ID5" [misc]
14-
qualifiers_final_annotation.py:59: error: Cannot assign to final attribute "ID6" [misc]
15-
qualifiers_final_annotation.py:62: error: Can only declare a final attribute in class body or __init__ [misc]
16-
qualifiers_final_annotation.py:63: error: Can only declare a final attribute in class body or __init__ [misc]
17-
qualifiers_final_annotation.py:65: error: Cannot assign to final attribute "ID7" [misc]
18-
qualifiers_final_annotation.py:67: error: Cannot assign to final attribute "ID7" [misc]
19-
qualifiers_final_annotation.py:71: error: Cannot assign to final name "RATE" [misc]
20-
qualifiers_final_annotation.py:81: error: Cannot assign to final attribute "DEFAULT_ID" [misc]
21-
qualifiers_final_annotation.py:94: error: Cannot assign to final name "BORDER_WIDTH" [misc]
22-
qualifiers_final_annotation.py:96: error: Cannot assign to final name "__private" [misc]
23-
qualifiers_final_annotation.py:107: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type]
24-
qualifiers_final_annotation.py:108: error: Variable should not be annotated with both ClassVar and Final [misc]
11+
qualifiers_final_annotation.py:30: error: Missing return statement [empty-body]
12+
qualifiers_final_annotation.py:32: error: Final name must be initialized with a value [misc]
13+
qualifiers_final_annotation.py:35: error: Cannot assign to final name "ID3" [misc]
14+
qualifiers_final_annotation.py:37: error: Cannot assign to final name "ID3" [misc]
15+
qualifiers_final_annotation.py:45: error: Type in Final[...] can only be omitted if there is an initializer [misc]
16+
qualifiers_final_annotation.py:49: error: Final name must be initialized with a value [misc]
17+
qualifiers_final_annotation.py:65: error: Cannot assign to final attribute "ID5" [misc]
18+
qualifiers_final_annotation.py:70: error: Cannot assign to final attribute "ID6" [misc]
19+
qualifiers_final_annotation.py:73: error: Can only declare a final attribute in class body or __init__ [misc]
20+
qualifiers_final_annotation.py:74: error: Can only declare a final attribute in class body or __init__ [misc]
21+
qualifiers_final_annotation.py:76: error: Cannot assign to final attribute "ID7" [misc]
22+
qualifiers_final_annotation.py:78: error: Cannot assign to final attribute "ID7" [misc]
23+
qualifiers_final_annotation.py:82: error: Cannot assign to final name "RATE" [misc]
24+
qualifiers_final_annotation.py:92: error: Cannot assign to final attribute "DEFAULT_ID" [misc]
25+
qualifiers_final_annotation.py:105: error: Cannot assign to final name "BORDER_WIDTH" [misc]
26+
qualifiers_final_annotation.py:107: error: Cannot assign to final name "__private" [misc]
2527
qualifiers_final_annotation.py:118: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type]
26-
qualifiers_final_annotation.py:121: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type]
27-
qualifiers_final_annotation.py:131: error: Invalid "NamedTuple()" field name [misc]
28-
qualifiers_final_annotation.py:133: error: Unexpected keyword argument "x" for "N" [call-arg]
29-
qualifiers_final_annotation.py:133: error: Unexpected keyword argument "y" for "N" [call-arg]
30-
qualifiers_final_annotation.py:134: error: Unexpected keyword argument "a" for "N" [call-arg]
31-
qualifiers_final_annotation.py:135: error: Unexpected keyword argument "x" for "N" [call-arg]
32-
qualifiers_final_annotation.py:135: error: Unexpected keyword argument "y" for "N" [call-arg]
33-
qualifiers_final_annotation.py:141: error: Cannot assign to final name "ID1" [misc]
34-
qualifiers_final_annotation.py:145: error: Cannot assign to final name "x" [misc]
35-
qualifiers_final_annotation.py:147: error: Cannot assign to final name "x" [misc]
36-
qualifiers_final_annotation.py:152: error: Incompatible types in assignment (expression has type "TextIOWrapper[_WrappedBuffer]", variable has type "int") [assignment]
37-
qualifiers_final_annotation.py:155: error: Cannot assign to final name "x" [misc]
38-
qualifiers_final_annotation.py:166: error: Cannot assign to final name "TEN" [misc]
39-
qualifiers_final_annotation.py:170: error: Cannot assign to final name "PI" [misc]
28+
qualifiers_final_annotation.py:119: error: Variable should not be annotated with both ClassVar and Final [misc]
29+
qualifiers_final_annotation.py:129: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type]
30+
qualifiers_final_annotation.py:132: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type]
31+
qualifiers_final_annotation.py:142: error: Invalid "NamedTuple()" field name [misc]
32+
qualifiers_final_annotation.py:144: error: Unexpected keyword argument "x" for "N" [call-arg]
33+
qualifiers_final_annotation.py:144: error: Unexpected keyword argument "y" for "N" [call-arg]
34+
qualifiers_final_annotation.py:145: error: Unexpected keyword argument "a" for "N" [call-arg]
35+
qualifiers_final_annotation.py:146: error: Unexpected keyword argument "x" for "N" [call-arg]
36+
qualifiers_final_annotation.py:146: error: Unexpected keyword argument "y" for "N" [call-arg]
37+
qualifiers_final_annotation.py:152: error: Cannot assign to final name "ID1" [misc]
38+
qualifiers_final_annotation.py:156: error: Cannot assign to final name "x" [misc]
39+
qualifiers_final_annotation.py:158: error: Cannot assign to final name "x" [misc]
40+
qualifiers_final_annotation.py:163: error: Incompatible types in assignment (expression has type "TextIOWrapper[_WrappedBuffer]", variable has type "int") [assignment]
41+
qualifiers_final_annotation.py:166: error: Cannot assign to final name "x" [misc]
42+
qualifiers_final_annotation.py:177: error: Cannot assign to final name "TEN" [misc]
43+
qualifiers_final_annotation.py:181: error: Cannot assign to final name "PI" [misc]
4044
"""
4145
conformance_automated = "Fail"
4246
errors_diff = """
43-
Line 149: Expected 1 errors
44-
Line 59: Unexpected errors ['qualifiers_final_annotation.py:59: error: Cannot assign to final attribute "ID6" [misc]']
45-
Line 96: Unexpected errors ['qualifiers_final_annotation.py:96: error: Cannot assign to final name "__private" [misc]']
46-
Line 131: Unexpected errors ['qualifiers_final_annotation.py:131: error: Invalid "NamedTuple()" field name [misc]']
47-
Line 133: Unexpected errors ['qualifiers_final_annotation.py:133: error: Unexpected keyword argument "x" for "N" [call-arg]', 'qualifiers_final_annotation.py:133: error: Unexpected keyword argument "y" for "N" [call-arg]']
47+
Line 160: Expected 1 errors
48+
Line 30: Unexpected errors ['qualifiers_final_annotation.py:30: error: Missing return statement [empty-body]']
49+
Line 32: Unexpected errors ['qualifiers_final_annotation.py:32: error: Final name must be initialized with a value [misc]']
50+
Line 35: Unexpected errors ['qualifiers_final_annotation.py:35: error: Cannot assign to final name "ID3" [misc]']
51+
Line 37: Unexpected errors ['qualifiers_final_annotation.py:37: error: Cannot assign to final name "ID3" [misc]']
52+
Line 70: Unexpected errors ['qualifiers_final_annotation.py:70: error: Cannot assign to final attribute "ID6" [misc]']
53+
Line 107: Unexpected errors ['qualifiers_final_annotation.py:107: error: Cannot assign to final name "__private" [misc]']
54+
Line 142: Unexpected errors ['qualifiers_final_annotation.py:142: error: Invalid "NamedTuple()" field name [misc]']
55+
Line 144: Unexpected errors ['qualifiers_final_annotation.py:144: error: Unexpected keyword argument "x" for "N" [call-arg]', 'qualifiers_final_annotation.py:144: error: Unexpected keyword argument "y" for "N" [call-arg]']
4856
"""

conformance/results/pyrefly/qualifiers_final_annotation.toml

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,40 +5,42 @@ Issues with NamedTuple interaction.
55
"""
66
conformance_automated = "Fail"
77
errors_diff = """
8-
Line 107: Expected 1 errors
9-
Line 131: Unexpected errors ['Expected first item to be a string literal [invalid-argument]', 'Expected first item to be a string literal [invalid-argument]']
10-
Line 133: Unexpected errors ['Unexpected keyword argument `x` in function `N.__new__` [unexpected-keyword]', 'Unexpected keyword argument `y` in function `N.__new__` [unexpected-keyword]']
8+
Line 118: Expected 1 errors
9+
Line 32: Unexpected errors ['Final name must be initialized with a value [invalid-annotation]']
10+
Line 142: Unexpected errors ['Expected first item to be a string literal [invalid-argument]', 'Expected first item to be a string literal [invalid-argument]']
11+
Line 144: Unexpected errors ['Unexpected keyword argument `x` in function `N.__new__` [unexpected-keyword]', 'Unexpected keyword argument `y` in function `N.__new__` [unexpected-keyword]']
1112
"""
1213
output = """
1314
ERROR qualifiers_final_annotation.py:16:7-12: Expected a type argument for `Final` [invalid-annotation]
1415
ERROR qualifiers_final_annotation.py:18:7-22: Expected 1 type argument for `Final`, got 2 [invalid-annotation]
15-
ERROR qualifiers_final_annotation.py:34:5-8: Final attribute declared in class body must be initialized with a value or in `__init__` [invalid-annotation]
16-
ERROR qualifiers_final_annotation.py:38:5-8: Final attribute declared in class body must be initialized with a value or in `__init__` [invalid-annotation]
17-
ERROR qualifiers_final_annotation.py:54:9-17: Cannot set field `ID5` [read-only]
18-
ERROR qualifiers_final_annotation.py:62:9-17: Cannot set field `id3` [read-only]
19-
ERROR qualifiers_final_annotation.py:63:9-17: Cannot set field `id4` [read-only]
20-
ERROR qualifiers_final_annotation.py:65:9-17: Cannot set field `ID7` [read-only]
21-
ERROR qualifiers_final_annotation.py:67:9-17: Cannot set field `ID7` [read-only]
22-
ERROR qualifiers_final_annotation.py:71:8-11: Cannot assign to variable `RATE` because it is marked final [bad-assignment]
23-
ERROR qualifiers_final_annotation.py:81:1-18: Cannot set field `DEFAULT_ID` [read-only]
24-
ERROR qualifiers_final_annotation.py:94:5-17: `BORDER_WIDTH` is declared as final in parent class `ClassC` [bad-override]
25-
ERROR qualifiers_final_annotation.py:108:19-27: `ClassVar` may not be nested inside `Final` [invalid-annotation]
26-
ERROR qualifiers_final_annotation.py:118:9-19: `Final` is not allowed in this context [invalid-annotation]
27-
ERROR qualifiers_final_annotation.py:121:14-19: `Final` is only allowed on a class or local variable annotation [invalid-annotation]
28-
ERROR qualifiers_final_annotation.py:121:14-30: `Final` is not allowed in this context [invalid-annotation]
29-
ERROR qualifiers_final_annotation.py:131:23-24: Expected first item to be a string literal [invalid-argument]
30-
ERROR qualifiers_final_annotation.py:131:33-34: Expected first item to be a string literal [invalid-argument]
31-
ERROR qualifiers_final_annotation.py:133:3-4: Unexpected keyword argument `x` in function `N.__new__` [unexpected-keyword]
32-
ERROR qualifiers_final_annotation.py:133:8-9: Unexpected keyword argument `y` in function `N.__new__` [unexpected-keyword]
33-
ERROR qualifiers_final_annotation.py:134:3-4: Unexpected keyword argument `a` in function `N.__new__` [unexpected-keyword]
34-
ERROR qualifiers_final_annotation.py:135:3-4: Unexpected keyword argument `x` in function `N.__new__` [unexpected-keyword]
35-
ERROR qualifiers_final_annotation.py:135:9-10: Unexpected keyword argument `y` in function `N.__new__` [unexpected-keyword]
36-
ERROR qualifiers_final_annotation.py:141:11-12: Cannot assign to variable `ID1` because it is marked final [bad-assignment]
37-
ERROR qualifiers_final_annotation.py:145:5-11: Cannot assign to variable `x` because it is marked final [bad-assignment]
38-
ERROR qualifiers_final_annotation.py:147:15-16: Cannot assign to variable `x` because it is marked final [bad-assignment]
39-
ERROR qualifiers_final_annotation.py:149:14-23: Cannot assign to variable `x` because it is marked final [bad-assignment]
40-
ERROR qualifiers_final_annotation.py:152:10-26: Cannot assign to variable `x` because it is marked final [bad-assignment]
41-
ERROR qualifiers_final_annotation.py:155:5-11: Cannot assign to variable `x` because it is marked final [bad-assignment]
42-
ERROR qualifiers_final_annotation.py:166:1-4: Cannot assign to `TEN` because it is imported as final [bad-assignment]
43-
ERROR qualifiers_final_annotation.py:170:1-3: Cannot assign to `PI` because it is imported as final [bad-assignment]
16+
ERROR qualifiers_final_annotation.py:32:1-4: Final name must be initialized with a value [invalid-annotation]
17+
ERROR qualifiers_final_annotation.py:45:5-8: Final attribute declared in class body must be initialized with a value or in `__init__` [invalid-annotation]
18+
ERROR qualifiers_final_annotation.py:49:5-8: Final attribute declared in class body must be initialized with a value or in `__init__` [invalid-annotation]
19+
ERROR qualifiers_final_annotation.py:65:9-17: Cannot set field `ID5` [read-only]
20+
ERROR qualifiers_final_annotation.py:73:9-17: Cannot set field `id3` [read-only]
21+
ERROR qualifiers_final_annotation.py:74:9-17: Cannot set field `id4` [read-only]
22+
ERROR qualifiers_final_annotation.py:76:9-17: Cannot set field `ID7` [read-only]
23+
ERROR qualifiers_final_annotation.py:78:9-17: Cannot set field `ID7` [read-only]
24+
ERROR qualifiers_final_annotation.py:82:8-11: Cannot assign to variable `RATE` because it is marked final [bad-assignment]
25+
ERROR qualifiers_final_annotation.py:92:1-18: Cannot set field `DEFAULT_ID` [read-only]
26+
ERROR qualifiers_final_annotation.py:105:5-17: `BORDER_WIDTH` is declared as final in parent class `ClassC` [bad-override]
27+
ERROR qualifiers_final_annotation.py:119:19-27: `ClassVar` may not be nested inside `Final` [invalid-annotation]
28+
ERROR qualifiers_final_annotation.py:129:9-19: `Final` is not allowed in this context [invalid-annotation]
29+
ERROR qualifiers_final_annotation.py:132:14-19: `Final` is only allowed on a class or local variable annotation [invalid-annotation]
30+
ERROR qualifiers_final_annotation.py:132:14-30: `Final` is not allowed in this context [invalid-annotation]
31+
ERROR qualifiers_final_annotation.py:142:23-24: Expected first item to be a string literal [invalid-argument]
32+
ERROR qualifiers_final_annotation.py:142:33-34: Expected first item to be a string literal [invalid-argument]
33+
ERROR qualifiers_final_annotation.py:144:3-4: Unexpected keyword argument `x` in function `N.__new__` [unexpected-keyword]
34+
ERROR qualifiers_final_annotation.py:144:8-9: Unexpected keyword argument `y` in function `N.__new__` [unexpected-keyword]
35+
ERROR qualifiers_final_annotation.py:145:3-4: Unexpected keyword argument `a` in function `N.__new__` [unexpected-keyword]
36+
ERROR qualifiers_final_annotation.py:146:3-4: Unexpected keyword argument `x` in function `N.__new__` [unexpected-keyword]
37+
ERROR qualifiers_final_annotation.py:146:9-10: Unexpected keyword argument `y` in function `N.__new__` [unexpected-keyword]
38+
ERROR qualifiers_final_annotation.py:152:11-12: Cannot assign to variable `ID1` because it is marked final [bad-assignment]
39+
ERROR qualifiers_final_annotation.py:156:5-11: Cannot assign to variable `x` because it is marked final [bad-assignment]
40+
ERROR qualifiers_final_annotation.py:158:15-16: Cannot assign to variable `x` because it is marked final [bad-assignment]
41+
ERROR qualifiers_final_annotation.py:160:14-23: Cannot assign to variable `x` because it is marked final [bad-assignment]
42+
ERROR qualifiers_final_annotation.py:163:10-26: Cannot assign to variable `x` because it is marked final [bad-assignment]
43+
ERROR qualifiers_final_annotation.py:166:5-11: Cannot assign to variable `x` because it is marked final [bad-assignment]
44+
ERROR qualifiers_final_annotation.py:177:1-4: Cannot assign to `TEN` because it is imported as final [bad-assignment]
45+
ERROR qualifiers_final_annotation.py:181:1-3: Cannot assign to `PI` because it is imported as final [bad-assignment]
4446
"""

0 commit comments

Comments
 (0)