Skip to content

Commit 790786b

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

File tree

8 files changed

+230
-156
lines changed

8 files changed

+230
-156
lines changed

conformance/results/mypy/qualifiers_final_annotation.toml

Lines changed: 45 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,45 +4,56 @@ Does not treat use of Final name as if it was replaced by the literal in NamedTu
44
Does not allow conditional assignment of Final instance variable in __init__ method.
55
Does not allow redefinition of private class variable that is marked Final in parent class.
66
Does not report modification of local Final variable via "for" statement.
7+
Does not allow split assignments.
78
"""
89
output = """
910
qualifiers_final_annotation.py:16: error: Type in Final[...] can only be omitted if there is an initializer [misc]
1011
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]
25-
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]
12+
qualifiers_final_annotation.py:33: error: Final name must be initialized with a value [misc]
13+
qualifiers_final_annotation.py:36: error: Cannot assign to final name "ID3" [misc]
14+
qualifiers_final_annotation.py:38: error: Cannot assign to final name "ID3" [misc]
15+
qualifiers_final_annotation.py:40: error: Final name must be initialized with a value [misc]
16+
qualifiers_final_annotation.py:43: error: Cannot assign to final name "ID4" [misc]
17+
qualifiers_final_annotation.py:45: error: Final name must be initialized with a value [misc]
18+
qualifiers_final_annotation.py:54: error: Type in Final[...] can only be omitted if there is an initializer [misc]
19+
qualifiers_final_annotation.py:58: error: Final name must be initialized with a value [misc]
20+
qualifiers_final_annotation.py:74: error: Cannot assign to final attribute "ID5" [misc]
21+
qualifiers_final_annotation.py:79: error: Cannot assign to final attribute "ID6" [misc]
22+
qualifiers_final_annotation.py:82: error: Can only declare a final attribute in class body or __init__ [misc]
23+
qualifiers_final_annotation.py:83: error: Can only declare a final attribute in class body or __init__ [misc]
24+
qualifiers_final_annotation.py:85: error: Cannot assign to final attribute "ID7" [misc]
25+
qualifiers_final_annotation.py:87: error: Cannot assign to final attribute "ID7" [misc]
26+
qualifiers_final_annotation.py:91: error: Cannot assign to final name "RATE" [misc]
27+
qualifiers_final_annotation.py:101: error: Cannot assign to final attribute "DEFAULT_ID" [misc]
28+
qualifiers_final_annotation.py:114: error: Cannot assign to final name "BORDER_WIDTH" [misc]
29+
qualifiers_final_annotation.py:116: error: Cannot assign to final name "__private" [misc]
30+
qualifiers_final_annotation.py:127: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type]
31+
qualifiers_final_annotation.py:128: error: Variable should not be annotated with both ClassVar and Final [misc]
32+
qualifiers_final_annotation.py:138: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type]
33+
qualifiers_final_annotation.py:141: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type]
34+
qualifiers_final_annotation.py:151: error: Invalid "NamedTuple()" field name [misc]
35+
qualifiers_final_annotation.py:153: error: Unexpected keyword argument "x" for "N" [call-arg]
36+
qualifiers_final_annotation.py:153: error: Unexpected keyword argument "y" for "N" [call-arg]
37+
qualifiers_final_annotation.py:154: error: Unexpected keyword argument "a" for "N" [call-arg]
38+
qualifiers_final_annotation.py:155: error: Unexpected keyword argument "x" for "N" [call-arg]
39+
qualifiers_final_annotation.py:155: error: Unexpected keyword argument "y" for "N" [call-arg]
40+
qualifiers_final_annotation.py:161: error: Cannot assign to final name "ID1" [misc]
41+
qualifiers_final_annotation.py:165: error: Cannot assign to final name "x" [misc]
42+
qualifiers_final_annotation.py:167: error: Cannot assign to final name "x" [misc]
43+
qualifiers_final_annotation.py:172: error: Incompatible types in assignment (expression has type "TextIOWrapper[_WrappedBuffer]", variable has type "int") [assignment]
44+
qualifiers_final_annotation.py:175: error: Cannot assign to final name "x" [misc]
45+
qualifiers_final_annotation.py:186: error: Cannot assign to final name "TEN" [misc]
46+
qualifiers_final_annotation.py:190: error: Cannot assign to final name "PI" [misc]
4047
"""
4148
conformance_automated = "Fail"
4249
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]']
50+
Line 169: Expected 1 errors
51+
Line 33: Unexpected errors ['qualifiers_final_annotation.py:33: error: Final name must be initialized with a value [misc]']
52+
Line 36: Unexpected errors ['qualifiers_final_annotation.py:36: error: Cannot assign to final name "ID3" [misc]']
53+
Line 38: Unexpected errors ['qualifiers_final_annotation.py:38: error: Cannot assign to final name "ID3" [misc]']
54+
Line 43: Unexpected errors ['qualifiers_final_annotation.py:43: error: Cannot assign to final name "ID4" [misc]']
55+
Line 79: Unexpected errors ['qualifiers_final_annotation.py:79: error: Cannot assign to final attribute "ID6" [misc]']
56+
Line 116: Unexpected errors ['qualifiers_final_annotation.py:116: error: Cannot assign to final name "__private" [misc]']
57+
Line 151: Unexpected errors ['qualifiers_final_annotation.py:151: error: Invalid "NamedTuple()" field name [misc]']
58+
Line 153: Unexpected errors ['qualifiers_final_annotation.py:153: error: Unexpected keyword argument "x" for "N" [call-arg]', 'qualifiers_final_annotation.py:153: error: Unexpected keyword argument "y" for "N" [call-arg]']
4859
"""

conformance/results/pyrefly/qualifiers_final_annotation.toml

Lines changed: 37 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,43 +2,48 @@ conformant = "Partial"
22
notes = """
33
Does not reject Final inside ClassVar.
44
Issues with NamedTuple interaction.
5+
Does not allow split assignments.
56
"""
67
conformance_automated = "Fail"
78
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]']
9+
Line 127: Expected 1 errors
10+
Line 33: Unexpected errors ['Final name must be initialized with a value [invalid-annotation]']
11+
Line 151: Unexpected errors ['Expected first item to be a string literal [invalid-argument]', 'Expected first item to be a string literal [invalid-argument]']
12+
Line 153: Unexpected errors ['Unexpected keyword argument `x` in function `N.__new__` [unexpected-keyword]', 'Unexpected keyword argument `y` in function `N.__new__` [unexpected-keyword]']
1113
"""
1214
output = """
1315
ERROR qualifiers_final_annotation.py:16:7-12: Expected a type argument for `Final` [invalid-annotation]
1416
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]
17+
ERROR qualifiers_final_annotation.py:33:1-4: Final name must be initialized with a value [invalid-annotation]
18+
ERROR qualifiers_final_annotation.py:40:1-4: Final name must be initialized with a value [invalid-annotation]
19+
ERROR qualifiers_final_annotation.py:45:1-4: Final name must be initialized with a value [invalid-annotation]
20+
ERROR qualifiers_final_annotation.py:54:5-8: Final attribute declared in class body must be initialized with a value or in `__init__` [invalid-annotation]
21+
ERROR qualifiers_final_annotation.py:58:5-8: Final attribute declared in class body must be initialized with a value or in `__init__` [invalid-annotation]
22+
ERROR qualifiers_final_annotation.py:74:9-17: Cannot set field `ID5` [read-only]
23+
ERROR qualifiers_final_annotation.py:82:9-17: Cannot set field `id3` [read-only]
24+
ERROR qualifiers_final_annotation.py:83:9-17: Cannot set field `id4` [read-only]
25+
ERROR qualifiers_final_annotation.py:85:9-17: Cannot set field `ID7` [read-only]
26+
ERROR qualifiers_final_annotation.py:87:9-17: Cannot set field `ID7` [read-only]
27+
ERROR qualifiers_final_annotation.py:91:8-11: Cannot assign to variable `RATE` because it is marked final [bad-assignment]
28+
ERROR qualifiers_final_annotation.py:101:1-18: Cannot set field `DEFAULT_ID` [read-only]
29+
ERROR qualifiers_final_annotation.py:114:5-17: `BORDER_WIDTH` is declared as final in parent class `ClassC` [bad-override]
30+
ERROR qualifiers_final_annotation.py:128:19-27: `ClassVar` may not be nested inside `Final` [invalid-annotation]
31+
ERROR qualifiers_final_annotation.py:138:9-19: `Final` is not allowed in this context [invalid-annotation]
32+
ERROR qualifiers_final_annotation.py:141:14-19: `Final` is only allowed on a class or local variable annotation [invalid-annotation]
33+
ERROR qualifiers_final_annotation.py:141:14-30: `Final` is not allowed in this context [invalid-annotation]
34+
ERROR qualifiers_final_annotation.py:151:23-24: Expected first item to be a string literal [invalid-argument]
35+
ERROR qualifiers_final_annotation.py:151:33-34: Expected first item to be a string literal [invalid-argument]
36+
ERROR qualifiers_final_annotation.py:153:3-4: Unexpected keyword argument `x` in function `N.__new__` [unexpected-keyword]
37+
ERROR qualifiers_final_annotation.py:153:8-9: Unexpected keyword argument `y` in function `N.__new__` [unexpected-keyword]
38+
ERROR qualifiers_final_annotation.py:154:3-4: Unexpected keyword argument `a` in function `N.__new__` [unexpected-keyword]
39+
ERROR qualifiers_final_annotation.py:155:3-4: Unexpected keyword argument `x` in function `N.__new__` [unexpected-keyword]
40+
ERROR qualifiers_final_annotation.py:155:9-10: Unexpected keyword argument `y` in function `N.__new__` [unexpected-keyword]
41+
ERROR qualifiers_final_annotation.py:161:11-12: Cannot assign to variable `ID1` because it is marked final [bad-assignment]
42+
ERROR qualifiers_final_annotation.py:165:5-11: Cannot assign to variable `x` because it is marked final [bad-assignment]
43+
ERROR qualifiers_final_annotation.py:167:15-16: Cannot assign to variable `x` because it is marked final [bad-assignment]
44+
ERROR qualifiers_final_annotation.py:169:14-23: Cannot assign to variable `x` because it is marked final [bad-assignment]
45+
ERROR qualifiers_final_annotation.py:172:10-26: Cannot assign to variable `x` because it is marked final [bad-assignment]
46+
ERROR qualifiers_final_annotation.py:175:5-11: Cannot assign to variable `x` because it is marked final [bad-assignment]
47+
ERROR qualifiers_final_annotation.py:186:1-4: Cannot assign to `TEN` because it is imported as final [bad-assignment]
48+
ERROR qualifiers_final_annotation.py:190:1-3: Cannot assign to `PI` because it is imported as final [bad-assignment]
4449
"""

0 commit comments

Comments
 (0)