diff --git a/conformance/results/mypy/qualifiers_final_annotation.toml b/conformance/results/mypy/qualifiers_final_annotation.toml index 2d0cea337..96d57cb6c 100644 --- a/conformance/results/mypy/qualifiers_final_annotation.toml +++ b/conformance/results/mypy/qualifiers_final_annotation.toml @@ -4,45 +4,56 @@ Does not treat use of Final name as if it was replaced by the literal in NamedTu Does not allow conditional assignment of Final instance variable in __init__ method. Does not allow redefinition of private class variable that is marked Final in parent class. Does not report modification of local Final variable via "for" statement. +Does not allow split assignments. """ output = """ qualifiers_final_annotation.py:16: error: Type in Final[...] can only be omitted if there is an initializer [misc] qualifiers_final_annotation.py:18: error: Final[...] takes at most one type argument [misc] -qualifiers_final_annotation.py:34: error: Type in Final[...] can only be omitted if there is an initializer [misc] -qualifiers_final_annotation.py:38: error: Final name must be initialized with a value [misc] -qualifiers_final_annotation.py:54: error: Cannot assign to final attribute "ID5" [misc] -qualifiers_final_annotation.py:59: error: Cannot assign to final attribute "ID6" [misc] -qualifiers_final_annotation.py:62: error: Can only declare a final attribute in class body or __init__ [misc] -qualifiers_final_annotation.py:63: error: Can only declare a final attribute in class body or __init__ [misc] -qualifiers_final_annotation.py:65: error: Cannot assign to final attribute "ID7" [misc] -qualifiers_final_annotation.py:67: error: Cannot assign to final attribute "ID7" [misc] -qualifiers_final_annotation.py:71: error: Cannot assign to final name "RATE" [misc] -qualifiers_final_annotation.py:81: error: Cannot assign to final attribute "DEFAULT_ID" [misc] -qualifiers_final_annotation.py:94: error: Cannot assign to final name "BORDER_WIDTH" [misc] -qualifiers_final_annotation.py:96: error: Cannot assign to final name "__private" [misc] -qualifiers_final_annotation.py:107: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type] -qualifiers_final_annotation.py:108: error: Variable should not be annotated with both ClassVar and Final [misc] -qualifiers_final_annotation.py:118: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type] -qualifiers_final_annotation.py:121: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type] -qualifiers_final_annotation.py:131: error: Invalid "NamedTuple()" field name [misc] -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] -qualifiers_final_annotation.py:134: error: Unexpected keyword argument "a" for "N" [call-arg] -qualifiers_final_annotation.py:135: error: Unexpected keyword argument "x" for "N" [call-arg] -qualifiers_final_annotation.py:135: error: Unexpected keyword argument "y" for "N" [call-arg] -qualifiers_final_annotation.py:141: error: Cannot assign to final name "ID1" [misc] -qualifiers_final_annotation.py:145: error: Cannot assign to final name "x" [misc] -qualifiers_final_annotation.py:147: error: Cannot assign to final name "x" [misc] -qualifiers_final_annotation.py:152: error: Incompatible types in assignment (expression has type "TextIOWrapper[_WrappedBuffer]", variable has type "int") [assignment] -qualifiers_final_annotation.py:155: error: Cannot assign to final name "x" [misc] -qualifiers_final_annotation.py:166: error: Cannot assign to final name "TEN" [misc] -qualifiers_final_annotation.py:170: error: Cannot assign to final name "PI" [misc] +qualifiers_final_annotation.py:33: error: Final name must be initialized with a value [misc] +qualifiers_final_annotation.py:36: error: Cannot assign to final name "ID3" [misc] +qualifiers_final_annotation.py:38: error: Cannot assign to final name "ID3" [misc] +qualifiers_final_annotation.py:40: error: Final name must be initialized with a value [misc] +qualifiers_final_annotation.py:43: error: Cannot assign to final name "ID4" [misc] +qualifiers_final_annotation.py:45: error: Final name must be initialized with a value [misc] +qualifiers_final_annotation.py:54: error: Type in Final[...] can only be omitted if there is an initializer [misc] +qualifiers_final_annotation.py:58: error: Final name must be initialized with a value [misc] +qualifiers_final_annotation.py:74: error: Cannot assign to final attribute "ID5" [misc] +qualifiers_final_annotation.py:79: error: Cannot assign to final attribute "ID6" [misc] +qualifiers_final_annotation.py:82: error: Can only declare a final attribute in class body or __init__ [misc] +qualifiers_final_annotation.py:83: error: Can only declare a final attribute in class body or __init__ [misc] +qualifiers_final_annotation.py:85: error: Cannot assign to final attribute "ID7" [misc] +qualifiers_final_annotation.py:87: error: Cannot assign to final attribute "ID7" [misc] +qualifiers_final_annotation.py:91: error: Cannot assign to final name "RATE" [misc] +qualifiers_final_annotation.py:101: error: Cannot assign to final attribute "DEFAULT_ID" [misc] +qualifiers_final_annotation.py:114: error: Cannot assign to final name "BORDER_WIDTH" [misc] +qualifiers_final_annotation.py:116: error: Cannot assign to final name "__private" [misc] +qualifiers_final_annotation.py:127: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type] +qualifiers_final_annotation.py:128: error: Variable should not be annotated with both ClassVar and Final [misc] +qualifiers_final_annotation.py:138: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type] +qualifiers_final_annotation.py:141: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type] +qualifiers_final_annotation.py:151: error: Invalid "NamedTuple()" field name [misc] +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] +qualifiers_final_annotation.py:154: error: Unexpected keyword argument "a" for "N" [call-arg] +qualifiers_final_annotation.py:155: error: Unexpected keyword argument "x" for "N" [call-arg] +qualifiers_final_annotation.py:155: error: Unexpected keyword argument "y" for "N" [call-arg] +qualifiers_final_annotation.py:161: error: Cannot assign to final name "ID1" [misc] +qualifiers_final_annotation.py:165: error: Cannot assign to final name "x" [misc] +qualifiers_final_annotation.py:167: error: Cannot assign to final name "x" [misc] +qualifiers_final_annotation.py:172: error: Incompatible types in assignment (expression has type "TextIOWrapper[_WrappedBuffer]", variable has type "int") [assignment] +qualifiers_final_annotation.py:175: error: Cannot assign to final name "x" [misc] +qualifiers_final_annotation.py:186: error: Cannot assign to final name "TEN" [misc] +qualifiers_final_annotation.py:190: error: Cannot assign to final name "PI" [misc] """ conformance_automated = "Fail" errors_diff = """ -Line 149: Expected 1 errors -Line 59: Unexpected errors ['qualifiers_final_annotation.py:59: error: Cannot assign to final attribute "ID6" [misc]'] -Line 96: Unexpected errors ['qualifiers_final_annotation.py:96: error: Cannot assign to final name "__private" [misc]'] -Line 131: Unexpected errors ['qualifiers_final_annotation.py:131: error: Invalid "NamedTuple()" field name [misc]'] -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]'] +Line 169: Expected 1 errors +Line 33: Unexpected errors ['qualifiers_final_annotation.py:33: error: Final name must be initialized with a value [misc]'] +Line 36: Unexpected errors ['qualifiers_final_annotation.py:36: error: Cannot assign to final name "ID3" [misc]'] +Line 38: Unexpected errors ['qualifiers_final_annotation.py:38: error: Cannot assign to final name "ID3" [misc]'] +Line 43: Unexpected errors ['qualifiers_final_annotation.py:43: error: Cannot assign to final name "ID4" [misc]'] +Line 79: Unexpected errors ['qualifiers_final_annotation.py:79: error: Cannot assign to final attribute "ID6" [misc]'] +Line 116: Unexpected errors ['qualifiers_final_annotation.py:116: error: Cannot assign to final name "__private" [misc]'] +Line 151: Unexpected errors ['qualifiers_final_annotation.py:151: error: Invalid "NamedTuple()" field name [misc]'] +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]'] """ diff --git a/conformance/results/pyrefly/qualifiers_final_annotation.toml b/conformance/results/pyrefly/qualifiers_final_annotation.toml index 10c83546a..5c816ba04 100644 --- a/conformance/results/pyrefly/qualifiers_final_annotation.toml +++ b/conformance/results/pyrefly/qualifiers_final_annotation.toml @@ -2,43 +2,48 @@ conformant = "Partial" notes = """ Does not reject Final inside ClassVar. Issues with NamedTuple interaction. +Does not allow split assignments. """ conformance_automated = "Fail" errors_diff = """ -Line 107: Expected 1 errors -Line 131: Unexpected errors ['Expected first item to be a string literal [invalid-argument]', 'Expected first item to be a string literal [invalid-argument]'] -Line 133: Unexpected errors ['Unexpected keyword argument `x` in function `N.__new__` [unexpected-keyword]', 'Unexpected keyword argument `y` in function `N.__new__` [unexpected-keyword]'] +Line 127: Expected 1 errors +Line 33: Unexpected errors ['Final name must be initialized with a value [invalid-annotation]'] +Line 151: Unexpected errors ['Expected first item to be a string literal [invalid-argument]', 'Expected first item to be a string literal [invalid-argument]'] +Line 153: Unexpected errors ['Unexpected keyword argument `x` in function `N.__new__` [unexpected-keyword]', 'Unexpected keyword argument `y` in function `N.__new__` [unexpected-keyword]'] """ output = """ ERROR qualifiers_final_annotation.py:16:7-12: Expected a type argument for `Final` [invalid-annotation] ERROR qualifiers_final_annotation.py:18:7-22: Expected 1 type argument for `Final`, got 2 [invalid-annotation] -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] -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] -ERROR qualifiers_final_annotation.py:54:9-17: Cannot set field `ID5` [read-only] -ERROR qualifiers_final_annotation.py:62:9-17: Cannot set field `id3` [read-only] -ERROR qualifiers_final_annotation.py:63:9-17: Cannot set field `id4` [read-only] -ERROR qualifiers_final_annotation.py:65:9-17: Cannot set field `ID7` [read-only] -ERROR qualifiers_final_annotation.py:67:9-17: Cannot set field `ID7` [read-only] -ERROR qualifiers_final_annotation.py:71:8-11: Cannot assign to variable `RATE` because it is marked final [bad-assignment] -ERROR qualifiers_final_annotation.py:81:1-18: Cannot set field `DEFAULT_ID` [read-only] -ERROR qualifiers_final_annotation.py:94:5-17: `BORDER_WIDTH` is declared as final in parent class `ClassC` [bad-override] -ERROR qualifiers_final_annotation.py:108:19-27: `ClassVar` may not be nested inside `Final` [invalid-annotation] -ERROR qualifiers_final_annotation.py:118:9-19: `Final` is not allowed in this context [invalid-annotation] -ERROR qualifiers_final_annotation.py:121:14-19: `Final` is only allowed on a class or local variable annotation [invalid-annotation] -ERROR qualifiers_final_annotation.py:121:14-30: `Final` is not allowed in this context [invalid-annotation] -ERROR qualifiers_final_annotation.py:131:23-24: Expected first item to be a string literal [invalid-argument] -ERROR qualifiers_final_annotation.py:131:33-34: Expected first item to be a string literal [invalid-argument] -ERROR qualifiers_final_annotation.py:133:3-4: Unexpected keyword argument `x` in function `N.__new__` [unexpected-keyword] -ERROR qualifiers_final_annotation.py:133:8-9: Unexpected keyword argument `y` in function `N.__new__` [unexpected-keyword] -ERROR qualifiers_final_annotation.py:134:3-4: Unexpected keyword argument `a` in function `N.__new__` [unexpected-keyword] -ERROR qualifiers_final_annotation.py:135:3-4: Unexpected keyword argument `x` in function `N.__new__` [unexpected-keyword] -ERROR qualifiers_final_annotation.py:135:9-10: Unexpected keyword argument `y` in function `N.__new__` [unexpected-keyword] -ERROR qualifiers_final_annotation.py:141:11-12: Cannot assign to variable `ID1` because it is marked final [bad-assignment] -ERROR qualifiers_final_annotation.py:145:5-11: Cannot assign to variable `x` because it is marked final [bad-assignment] -ERROR qualifiers_final_annotation.py:147:15-16: Cannot assign to variable `x` because it is marked final [bad-assignment] -ERROR qualifiers_final_annotation.py:149:14-23: Cannot assign to variable `x` because it is marked final [bad-assignment] -ERROR qualifiers_final_annotation.py:152:10-26: Cannot assign to variable `x` because it is marked final [bad-assignment] -ERROR qualifiers_final_annotation.py:155:5-11: Cannot assign to variable `x` because it is marked final [bad-assignment] -ERROR qualifiers_final_annotation.py:166:1-4: Cannot assign to `TEN` because it is imported as final [bad-assignment] -ERROR qualifiers_final_annotation.py:170:1-3: Cannot assign to `PI` because it is imported as final [bad-assignment] +ERROR qualifiers_final_annotation.py:33:1-4: Final name must be initialized with a value [invalid-annotation] +ERROR qualifiers_final_annotation.py:40:1-4: Final name must be initialized with a value [invalid-annotation] +ERROR qualifiers_final_annotation.py:45:1-4: Final name must be initialized with a value [invalid-annotation] +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] +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] +ERROR qualifiers_final_annotation.py:74:9-17: Cannot set field `ID5` [read-only] +ERROR qualifiers_final_annotation.py:82:9-17: Cannot set field `id3` [read-only] +ERROR qualifiers_final_annotation.py:83:9-17: Cannot set field `id4` [read-only] +ERROR qualifiers_final_annotation.py:85:9-17: Cannot set field `ID7` [read-only] +ERROR qualifiers_final_annotation.py:87:9-17: Cannot set field `ID7` [read-only] +ERROR qualifiers_final_annotation.py:91:8-11: Cannot assign to variable `RATE` because it is marked final [bad-assignment] +ERROR qualifiers_final_annotation.py:101:1-18: Cannot set field `DEFAULT_ID` [read-only] +ERROR qualifiers_final_annotation.py:114:5-17: `BORDER_WIDTH` is declared as final in parent class `ClassC` [bad-override] +ERROR qualifiers_final_annotation.py:128:19-27: `ClassVar` may not be nested inside `Final` [invalid-annotation] +ERROR qualifiers_final_annotation.py:138:9-19: `Final` is not allowed in this context [invalid-annotation] +ERROR qualifiers_final_annotation.py:141:14-19: `Final` is only allowed on a class or local variable annotation [invalid-annotation] +ERROR qualifiers_final_annotation.py:141:14-30: `Final` is not allowed in this context [invalid-annotation] +ERROR qualifiers_final_annotation.py:151:23-24: Expected first item to be a string literal [invalid-argument] +ERROR qualifiers_final_annotation.py:151:33-34: Expected first item to be a string literal [invalid-argument] +ERROR qualifiers_final_annotation.py:153:3-4: Unexpected keyword argument `x` in function `N.__new__` [unexpected-keyword] +ERROR qualifiers_final_annotation.py:153:8-9: Unexpected keyword argument `y` in function `N.__new__` [unexpected-keyword] +ERROR qualifiers_final_annotation.py:154:3-4: Unexpected keyword argument `a` in function `N.__new__` [unexpected-keyword] +ERROR qualifiers_final_annotation.py:155:3-4: Unexpected keyword argument `x` in function `N.__new__` [unexpected-keyword] +ERROR qualifiers_final_annotation.py:155:9-10: Unexpected keyword argument `y` in function `N.__new__` [unexpected-keyword] +ERROR qualifiers_final_annotation.py:161:11-12: Cannot assign to variable `ID1` because it is marked final [bad-assignment] +ERROR qualifiers_final_annotation.py:165:5-11: Cannot assign to variable `x` because it is marked final [bad-assignment] +ERROR qualifiers_final_annotation.py:167:15-16: Cannot assign to variable `x` because it is marked final [bad-assignment] +ERROR qualifiers_final_annotation.py:169:14-23: Cannot assign to variable `x` because it is marked final [bad-assignment] +ERROR qualifiers_final_annotation.py:172:10-26: Cannot assign to variable `x` because it is marked final [bad-assignment] +ERROR qualifiers_final_annotation.py:175:5-11: Cannot assign to variable `x` because it is marked final [bad-assignment] +ERROR qualifiers_final_annotation.py:186:1-4: Cannot assign to `TEN` because it is imported as final [bad-assignment] +ERROR qualifiers_final_annotation.py:190:1-3: Cannot assign to `PI` because it is imported as final [bad-assignment] """ diff --git a/conformance/results/pyright/qualifiers_final_annotation.toml b/conformance/results/pyright/qualifiers_final_annotation.toml index 38f55274a..83d8036fd 100644 --- a/conformance/results/pyright/qualifiers_final_annotation.toml +++ b/conformance/results/pyright/qualifiers_final_annotation.toml @@ -1,45 +1,52 @@ -conformant = "Pass" +conformant = "Partial" +notes = """ +Does not allow split assignments. +""" output = """ qualifiers_final_annotation.py:16:1 - error: "BAD1" is declared Final, but value is not assigned (reportGeneralTypeIssues) qualifiers_final_annotation.py:18:7 - error: Expected a single type argument after "Final" (reportInvalidTypeForm) -qualifiers_final_annotation.py:34:5 - error: "ID2" is declared Final, but value is not assigned (reportGeneralTypeIssues) -qualifiers_final_annotation.py:38:5 - error: "ID3" is declared Final, but value is not assigned (reportGeneralTypeIssues) -qualifiers_final_annotation.py:54:14 - error: Cannot assign to attribute "ID5" for class "ClassA*" +qualifiers_final_annotation.py:38:5 - error: "ID3" is declared as Final and cannot be reassigned (reportGeneralTypeIssues) +qualifiers_final_annotation.py:45:1 - error: "ID5" is declared Final, but value is not assigned (reportGeneralTypeIssues) +qualifiers_final_annotation.py:54:5 - error: "ID2" is declared Final, but value is not assigned (reportGeneralTypeIssues) +qualifiers_final_annotation.py:58:5 - error: "ID3" is declared Final, but value is not assigned (reportGeneralTypeIssues) +qualifiers_final_annotation.py:74:14 - error: Cannot assign to attribute "ID5" for class "ClassA*"   Attribute "ID5" cannot be assigned through a class instance because it is a ClassVar   "ID5" is declared as Final and cannot be reassigned (reportAttributeAccessIssue) -qualifiers_final_annotation.py:62:19 - error: "Final" is not allowed in this context (reportInvalidTypeForm) -qualifiers_final_annotation.py:63:19 - error: "Final" is not allowed in this context (reportInvalidTypeForm) -qualifiers_final_annotation.py:63:32 - error: Cannot assign to attribute "id4" for class "ClassA*" +qualifiers_final_annotation.py:82:19 - error: "Final" is not allowed in this context (reportInvalidTypeForm) +qualifiers_final_annotation.py:83:19 - error: "Final" is not allowed in this context (reportInvalidTypeForm) +qualifiers_final_annotation.py:83:32 - error: Cannot assign to attribute "id4" for class "ClassA*"   "Literal[1]" is not assignable to "Final" (reportAttributeAccessIssue) -qualifiers_final_annotation.py:65:14 - error: Cannot assign to attribute "ID7" for class "ClassA*" +qualifiers_final_annotation.py:85:14 - error: Cannot assign to attribute "ID7" for class "ClassA*"   Attribute "ID7" cannot be assigned through a class instance because it is a ClassVar   "ID7" is declared as Final and cannot be reassigned (reportAttributeAccessIssue) -qualifiers_final_annotation.py:67:14 - error: Cannot assign to attribute "ID7" for class "ClassA*" +qualifiers_final_annotation.py:87:14 - error: Cannot assign to attribute "ID7" for class "ClassA*"   Attribute "ID7" cannot be assigned through a class instance because it is a ClassVar   "ID7" is declared as Final and cannot be reassigned (reportAttributeAccessIssue) -qualifiers_final_annotation.py:71:1 - error: "RATE" is declared as Final and cannot be reassigned (reportGeneralTypeIssues) -qualifiers_final_annotation.py:81:8 - error: Cannot assign to attribute "DEFAULT_ID" for class "type[ClassB]" +qualifiers_final_annotation.py:91:1 - error: "RATE" is declared as Final and cannot be reassigned (reportGeneralTypeIssues) +qualifiers_final_annotation.py:101:8 - error: Cannot assign to attribute "DEFAULT_ID" for class "type[ClassB]"   "DEFAULT_ID" is declared as Final and cannot be reassigned (reportAttributeAccessIssue) -qualifiers_final_annotation.py:94:5 - error: "BORDER_WIDTH" cannot be redeclared because parent class "ClassC" declares it as Final (reportGeneralTypeIssues) -qualifiers_final_annotation.py:107:22 - error: "Final" is not allowed in this context (reportInvalidTypeForm) -qualifiers_final_annotation.py:108:19 - error: "ClassVar" is not allowed in this context (reportInvalidTypeForm) -qualifiers_final_annotation.py:118:9 - error: "Final" is not allowed in this context (reportInvalidTypeForm) -qualifiers_final_annotation.py:121:14 - error: "Final" is not allowed in this context (reportInvalidTypeForm) -qualifiers_final_annotation.py:134:1 - error: Arguments missing for parameters "x", "y" (reportCallIssue) -qualifiers_final_annotation.py:134:3 - error: No parameter named "a" (reportCallIssue) -qualifiers_final_annotation.py:135:5 - error: Argument of type "Literal['']" cannot be assigned to parameter "x" of type "int" in function "__new__" +qualifiers_final_annotation.py:114:5 - error: "BORDER_WIDTH" cannot be redeclared because parent class "ClassC" declares it as Final (reportGeneralTypeIssues) +qualifiers_final_annotation.py:127:22 - error: "Final" is not allowed in this context (reportInvalidTypeForm) +qualifiers_final_annotation.py:128:19 - error: "ClassVar" is not allowed in this context (reportInvalidTypeForm) +qualifiers_final_annotation.py:138:9 - error: "Final" is not allowed in this context (reportInvalidTypeForm) +qualifiers_final_annotation.py:141:14 - error: "Final" is not allowed in this context (reportInvalidTypeForm) +qualifiers_final_annotation.py:154:1 - error: Arguments missing for parameters "x", "y" (reportCallIssue) +qualifiers_final_annotation.py:154:3 - error: No parameter named "a" (reportCallIssue) +qualifiers_final_annotation.py:155:5 - error: Argument of type "Literal['']" cannot be assigned to parameter "x" of type "int" in function "__new__"   "Literal['']" is not assignable to "int" (reportArgumentType) -qualifiers_final_annotation.py:135:11 - error: Argument of type "Literal['']" cannot be assigned to parameter "y" of type "int" in function "__new__" +qualifiers_final_annotation.py:155:11 - error: Argument of type "Literal['']" cannot be assigned to parameter "y" of type "int" in function "__new__"   "Literal['']" is not assignable to "int" (reportArgumentType) -qualifiers_final_annotation.py:141:5 - error: "ID1" is declared as Final and cannot be reassigned (reportGeneralTypeIssues) -qualifiers_final_annotation.py:145:5 - error: "x" is declared as Final and cannot be reassigned (reportGeneralTypeIssues) -qualifiers_final_annotation.py:147:10 - error: "x" is declared as Final and cannot be reassigned (reportGeneralTypeIssues) -qualifiers_final_annotation.py:149:9 - error: "x" is declared as Final and cannot be reassigned (reportGeneralTypeIssues) -qualifiers_final_annotation.py:152:30 - error: "x" is declared as Final and cannot be reassigned (reportGeneralTypeIssues) -qualifiers_final_annotation.py:155:9 - error: "x" is declared as Final and cannot be reassigned (reportGeneralTypeIssues) -qualifiers_final_annotation.py:166:1 - error: "TEN" is declared as Final and cannot be reassigned (reportGeneralTypeIssues) -qualifiers_final_annotation.py:170:1 - error: "PI" is declared as Final and cannot be reassigned (reportGeneralTypeIssues) +qualifiers_final_annotation.py:161:5 - error: "ID1" is declared as Final and cannot be reassigned (reportGeneralTypeIssues) +qualifiers_final_annotation.py:165:5 - error: "x" is declared as Final and cannot be reassigned (reportGeneralTypeIssues) +qualifiers_final_annotation.py:167:10 - error: "x" is declared as Final and cannot be reassigned (reportGeneralTypeIssues) +qualifiers_final_annotation.py:169:9 - error: "x" is declared as Final and cannot be reassigned (reportGeneralTypeIssues) +qualifiers_final_annotation.py:172:30 - error: "x" is declared as Final and cannot be reassigned (reportGeneralTypeIssues) +qualifiers_final_annotation.py:175:9 - error: "x" is declared as Final and cannot be reassigned (reportGeneralTypeIssues) +qualifiers_final_annotation.py:186:1 - error: "TEN" is declared as Final and cannot be reassigned (reportGeneralTypeIssues) +qualifiers_final_annotation.py:190:1 - error: "PI" is declared as Final and cannot be reassigned (reportGeneralTypeIssues) """ -conformance_automated = "Pass" +conformance_automated = "Fail" errors_diff = """ +Line 40: Expected 1 errors +Line 38: Unexpected errors ['qualifiers_final_annotation.py:38:5 - error: "ID3" is declared as Final and cannot be reassigned (reportGeneralTypeIssues)'] """ diff --git a/conformance/results/results.html b/conformance/results/results.html index 3ddb751cd..b95d50109 100644 --- a/conformance/results/results.html +++ b/conformance/results/results.html @@ -493,11 +493,11 @@

Python Type System Conformance Test Results

Pass      qualifiers_final_annotation -
Partial

Does not treat use of Final name as if it was replaced by the literal in NamedTuple definition.

Does not allow conditional assignment of Final instance variable in __init__ method.

Does not allow redefinition of private class variable that is marked Final in parent class.

Does not report modification of local Final variable via "for" statement.

-Pass -Pass -
Partial

Does not reject Final inside ClassVar.

Issues with NamedTuple interaction.

-Pass +
Partial

Does not treat use of Final name as if it was replaced by the literal in NamedTuple definition.

Does not allow conditional assignment of Final instance variable in __init__ method.

Does not allow redefinition of private class variable that is marked Final in parent class.

Does not report modification of local Final variable via "for" statement.

Does not allow split assignments.

+
Partial

Does not allow split assignments.

+
Partial

Does not allow split assignments.

+
Partial

Does not reject Final inside ClassVar.

Issues with NamedTuple interaction.

Does not allow split assignments.

+
Partial

Doesn't report an error with non-exhaustive `Final` assignment.

     qualifiers_final_decorator Pass diff --git a/conformance/results/ty/qualifiers_final_annotation.toml b/conformance/results/ty/qualifiers_final_annotation.toml index 10678afda..9f2827061 100644 --- a/conformance/results/ty/qualifiers_final_annotation.toml +++ b/conformance/results/ty/qualifiers_final_annotation.toml @@ -1,33 +1,39 @@ -conformance_automated = "Pass" +conformant = "Partial" +notes = """ +Doesn't report an error with non-exhaustive `Final` assignment. +""" +conformance_automated = "Fail" errors_diff = """ +Line 40: Expected 1 errors """ output = """ qualifiers_final_annotation.py:16:1: error[final-without-value] `Final` symbol `BAD1` is not assigned a value qualifiers_final_annotation.py:18:7: error[invalid-type-form] Type qualifier `typing.Final` expected exactly 1 argument, got 2 -qualifiers_final_annotation.py:34:5: error[final-without-value] `Final` symbol `ID2` is not assigned a value -qualifiers_final_annotation.py:38:5: error[final-without-value] `Final` symbol `ID3` is not assigned a value -qualifiers_final_annotation.py:54:9: error[invalid-assignment] Invalid assignment to final attribute: `ID5` already has a value in the class body -qualifiers_final_annotation.py:62:9: error[invalid-assignment] Cannot assign to final attribute `id3` on type `Self@method1`: `Final` attributes can only be assigned in the class body or `__init__` -qualifiers_final_annotation.py:63:9: error[invalid-assignment] Cannot assign to final attribute `id4` on type `Self@method1`: `Final` attributes can only be assigned in the class body or `__init__` -qualifiers_final_annotation.py:65:9: error[invalid-assignment] Cannot assign to final attribute `ID7` on type `Self@method1`: `Final` attributes can only be assigned in the class body or `__init__` -qualifiers_final_annotation.py:67:9: error[invalid-assignment] Cannot assign to final attribute `ID7` on type `Self@method1`: `Final` attributes can only be assigned in the class body or `__init__` -qualifiers_final_annotation.py:71:1: error[invalid-assignment] Reassignment of `Final` symbol `RATE` is not allowed: Symbol later reassigned here -qualifiers_final_annotation.py:81:1: error[invalid-assignment] Cannot assign to final attribute `DEFAULT_ID` on type ``: `Final` attributes can only be assigned in the class body or `__init__` -qualifiers_final_annotation.py:94:5: error[override-of-final-variable] Cannot override final variable `BORDER_WIDTH` from superclass `ClassC` -qualifiers_final_annotation.py:107:13: error[redundant-final-classvar] `Combining `ClassVar` and `Final` is redundant -qualifiers_final_annotation.py:108:13: error[redundant-final-classvar] `Combining `ClassVar` and `Final` is redundant -qualifiers_final_annotation.py:118:9: error[invalid-type-form] Type qualifier `typing.Final` is not allowed in type expressions (only in annotation expressions) -qualifiers_final_annotation.py:121:14: error[invalid-type-form] Type qualifier `typing.Final` is not allowed in parameter annotations -qualifiers_final_annotation.py:134:1: error[missing-argument] No arguments provided for required parameters `x`, `y` -qualifiers_final_annotation.py:134:3: error[unknown-argument] Argument `a` does not match any known parameter -qualifiers_final_annotation.py:135:3: error[invalid-argument-type] Argument is incorrect: Expected `int`, found `Literal[""]` -qualifiers_final_annotation.py:135:9: error[invalid-argument-type] Argument is incorrect: Expected `int`, found `Literal[""]` -qualifiers_final_annotation.py:141:5: error[invalid-assignment] Reassignment of `Final` symbol `ID1` is not allowed: Reassignment of `Final` symbol -qualifiers_final_annotation.py:145:5: error[invalid-assignment] Reassignment of `Final` symbol `x` is not allowed: Symbol later reassigned here -qualifiers_final_annotation.py:147:10: error[invalid-assignment] Reassignment of `Final` symbol `x` is not allowed: Symbol later reassigned here -qualifiers_final_annotation.py:149:9: error[invalid-assignment] Reassignment of `Final` symbol `x` is not allowed: Symbol later reassigned here -qualifiers_final_annotation.py:152:30: error[invalid-assignment] Reassignment of `Final` symbol `x` is not allowed: Symbol later reassigned here -qualifiers_final_annotation.py:155:9: error[invalid-assignment] Reassignment of `Final` symbol `x` is not allowed: Symbol later reassigned here -qualifiers_final_annotation.py:166:1: error[invalid-assignment] Reassignment of `Final` symbol `TEN` is not allowed: Reassignment of `Final` symbol -qualifiers_final_annotation.py:170:1: error[invalid-assignment] Reassignment of `Final` symbol `PI` is not allowed: Reassignment of `Final` symbol +qualifiers_final_annotation.py:45:1: error[final-without-value] `Final` symbol `ID5` is not assigned a value +qualifiers_final_annotation.py:54:5: error[final-without-value] `Final` symbol `ID2` is not assigned a value +qualifiers_final_annotation.py:58:5: error[final-without-value] `Final` symbol `ID3` is not assigned a value +qualifiers_final_annotation.py:74:9: error[invalid-assignment] Invalid assignment to final attribute: `ID5` already has a value in the class body +qualifiers_final_annotation.py:82:9: error[invalid-assignment] Cannot assign to final attribute `id3` on type `Self@method1`: `Final` attributes can only be assigned in the class body or `__init__` +qualifiers_final_annotation.py:83:9: error[invalid-assignment] Cannot assign to final attribute `id4` on type `Self@method1`: `Final` attributes can only be assigned in the class body or `__init__` +qualifiers_final_annotation.py:85:9: error[invalid-assignment] Cannot assign to final attribute `ID7` on type `Self@method1`: `Final` attributes can only be assigned in the class body or `__init__` +qualifiers_final_annotation.py:87:9: error[invalid-assignment] Cannot assign to final attribute `ID7` on type `Self@method1`: `Final` attributes can only be assigned in the class body or `__init__` +qualifiers_final_annotation.py:91:1: error[invalid-assignment] Reassignment of `Final` symbol `RATE` is not allowed: Symbol later reassigned here +qualifiers_final_annotation.py:101:1: error[invalid-assignment] Cannot assign to final attribute `DEFAULT_ID` on type ``: `Final` attributes can only be assigned in the class body or `__init__` +qualifiers_final_annotation.py:114:5: error[override-of-final-variable] Cannot override final variable `BORDER_WIDTH` from superclass `ClassC` +qualifiers_final_annotation.py:127:13: error[redundant-final-classvar] `Combining `ClassVar` and `Final` is redundant +qualifiers_final_annotation.py:128:13: error[redundant-final-classvar] `Combining `ClassVar` and `Final` is redundant +qualifiers_final_annotation.py:138:9: error[invalid-type-form] Type qualifier `typing.Final` is not allowed in type expressions (only in annotation expressions) +qualifiers_final_annotation.py:141:14: error[invalid-type-form] Type qualifier `typing.Final` is not allowed in parameter annotations +qualifiers_final_annotation.py:154:1: error[missing-argument] No arguments provided for required parameters `x`, `y` +qualifiers_final_annotation.py:154:3: error[unknown-argument] Argument `a` does not match any known parameter +qualifiers_final_annotation.py:155:3: error[invalid-argument-type] Argument is incorrect: Expected `int`, found `Literal[""]` +qualifiers_final_annotation.py:155:9: error[invalid-argument-type] Argument is incorrect: Expected `int`, found `Literal[""]` +qualifiers_final_annotation.py:161:5: error[invalid-assignment] Reassignment of `Final` symbol `ID1` is not allowed: Reassignment of `Final` symbol +qualifiers_final_annotation.py:165:5: error[invalid-assignment] Reassignment of `Final` symbol `x` is not allowed: Symbol later reassigned here +qualifiers_final_annotation.py:167:10: error[invalid-assignment] Reassignment of `Final` symbol `x` is not allowed: Symbol later reassigned here +qualifiers_final_annotation.py:169:9: error[invalid-assignment] Reassignment of `Final` symbol `x` is not allowed: Symbol later reassigned here +qualifiers_final_annotation.py:172:30: error[invalid-assignment] Reassignment of `Final` symbol `x` is not allowed: Symbol later reassigned here +qualifiers_final_annotation.py:175:9: error[invalid-assignment] Reassignment of `Final` symbol `x` is not allowed: Symbol later reassigned here +qualifiers_final_annotation.py:186:1: error[invalid-assignment] Reassignment of `Final` symbol `TEN` is not allowed: Reassignment of `Final` symbol +qualifiers_final_annotation.py:190:1: error[invalid-assignment] Reassignment of `Final` symbol `PI` is not allowed: Reassignment of `Final` symbol """ diff --git a/conformance/results/zuban/qualifiers_final_annotation.toml b/conformance/results/zuban/qualifiers_final_annotation.toml index 32a15ea44..2615769d6 100644 --- a/conformance/results/zuban/qualifiers_final_annotation.toml +++ b/conformance/results/zuban/qualifiers_final_annotation.toml @@ -1,33 +1,47 @@ -conformance_automated = "Pass" +conformant = "Partial" +notes = """ +Does not allow split assignments. +""" +conformance_automated = "Fail" errors_diff = """ +Line 33: Unexpected errors ['qualifiers_final_annotation.py:33: error: Final name must be initialized with a value [misc]'] +Line 36: Unexpected errors ['qualifiers_final_annotation.py:36: error: Cannot assign to final name "ID3" [misc]'] +Line 38: Unexpected errors ['qualifiers_final_annotation.py:38: error: Cannot assign to final name "ID3" [misc]'] +Line 43: Unexpected errors ['qualifiers_final_annotation.py:43: error: Cannot assign to final name "ID4" [misc]'] """ output = """ qualifiers_final_annotation.py:16: error: Type in Final[...] can only be omitted if there is an initializer [misc] qualifiers_final_annotation.py:18: error: Final[...] takes at most one type argument [misc] -qualifiers_final_annotation.py:34: error: Type in Final[...] can only be omitted if there is an initializer [misc] -qualifiers_final_annotation.py:38: error: Final name must be initialized with a value [misc] -qualifiers_final_annotation.py:54: error: Cannot assign to final attribute "ID5" [misc] -qualifiers_final_annotation.py:62: error: Can only declare a final attribute in class body or __init__ [misc] -qualifiers_final_annotation.py:63: error: Can only declare a final attribute in class body or __init__ [misc] -qualifiers_final_annotation.py:65: error: Cannot assign to final attribute "ID7" [misc] -qualifiers_final_annotation.py:67: error: Cannot assign to final attribute "ID7" [misc] -qualifiers_final_annotation.py:71: error: Cannot assign to final name "RATE" [misc] -qualifiers_final_annotation.py:81: error: Cannot assign to final attribute "DEFAULT_ID" [misc] -qualifiers_final_annotation.py:94: error: Cannot assign to final name "BORDER_WIDTH" [misc] -qualifiers_final_annotation.py:107: error: Final can be only used as an outermost qualifier in a variable annotation [misc] -qualifiers_final_annotation.py:108: error: Invalid Type: ClassVar nested inside other type [misc] -qualifiers_final_annotation.py:118: error: Final can be only used as an outermost qualifier in a variable annotation [misc] -qualifiers_final_annotation.py:121: error: Final can be only used as an outermost qualifier in a variable annotation [misc] -qualifiers_final_annotation.py:134: error: Unexpected keyword argument "a" for "N" [call-arg] -qualifiers_final_annotation.py:135: error: Argument "x" to "N" has incompatible type "str"; expected "int" [arg-type] -qualifiers_final_annotation.py:135: error: Argument "y" to "N" has incompatible type "str"; expected "int" [arg-type] -qualifiers_final_annotation.py:141: error: Cannot assign to final name "ID1" [misc] -qualifiers_final_annotation.py:145: error: Cannot assign to final name "x" [misc] -qualifiers_final_annotation.py:147: error: Cannot assign to final name "x" [misc] -qualifiers_final_annotation.py:149: error: Cannot assign to final name "x" [misc] -qualifiers_final_annotation.py:152: error: Cannot assign to final name "x" [misc] -qualifiers_final_annotation.py:152: error: Incompatible types in assignment (expression has type "TextIOWrapper[_WrappedBuffer]", variable has type "int") [assignment] -qualifiers_final_annotation.py:155: error: Cannot assign to final name "x" [misc] -qualifiers_final_annotation.py:166: error: Cannot assign to final name "TEN" [misc] -qualifiers_final_annotation.py:170: error: Cannot assign to final name "PI" [misc] +qualifiers_final_annotation.py:33: error: Final name must be initialized with a value [misc] +qualifiers_final_annotation.py:36: error: Cannot assign to final name "ID3" [misc] +qualifiers_final_annotation.py:38: error: Cannot assign to final name "ID3" [misc] +qualifiers_final_annotation.py:40: error: Final name must be initialized with a value [misc] +qualifiers_final_annotation.py:43: error: Cannot assign to final name "ID4" [misc] +qualifiers_final_annotation.py:45: error: Final name must be initialized with a value [misc] +qualifiers_final_annotation.py:54: error: Type in Final[...] can only be omitted if there is an initializer [misc] +qualifiers_final_annotation.py:58: error: Final name must be initialized with a value [misc] +qualifiers_final_annotation.py:74: error: Cannot assign to final attribute "ID5" [misc] +qualifiers_final_annotation.py:82: error: Can only declare a final attribute in class body or __init__ [misc] +qualifiers_final_annotation.py:83: error: Can only declare a final attribute in class body or __init__ [misc] +qualifiers_final_annotation.py:85: error: Cannot assign to final attribute "ID7" [misc] +qualifiers_final_annotation.py:87: error: Cannot assign to final attribute "ID7" [misc] +qualifiers_final_annotation.py:91: error: Cannot assign to final name "RATE" [misc] +qualifiers_final_annotation.py:101: error: Cannot assign to final attribute "DEFAULT_ID" [misc] +qualifiers_final_annotation.py:114: error: Cannot assign to final name "BORDER_WIDTH" [misc] +qualifiers_final_annotation.py:127: error: Final can be only used as an outermost qualifier in a variable annotation [misc] +qualifiers_final_annotation.py:128: error: Invalid Type: ClassVar nested inside other type [misc] +qualifiers_final_annotation.py:138: error: Final can be only used as an outermost qualifier in a variable annotation [misc] +qualifiers_final_annotation.py:141: error: Final can be only used as an outermost qualifier in a variable annotation [misc] +qualifiers_final_annotation.py:154: error: Unexpected keyword argument "a" for "N" [call-arg] +qualifiers_final_annotation.py:155: error: Argument "x" to "N" has incompatible type "str"; expected "int" [arg-type] +qualifiers_final_annotation.py:155: error: Argument "y" to "N" has incompatible type "str"; expected "int" [arg-type] +qualifiers_final_annotation.py:161: error: Cannot assign to final name "ID1" [misc] +qualifiers_final_annotation.py:165: error: Cannot assign to final name "x" [misc] +qualifiers_final_annotation.py:167: error: Cannot assign to final name "x" [misc] +qualifiers_final_annotation.py:169: error: Cannot assign to final name "x" [misc] +qualifiers_final_annotation.py:172: error: Cannot assign to final name "x" [misc] +qualifiers_final_annotation.py:172: error: Incompatible types in assignment (expression has type "TextIOWrapper[_WrappedBuffer]", variable has type "int") [assignment] +qualifiers_final_annotation.py:175: error: Cannot assign to final name "x" [misc] +qualifiers_final_annotation.py:186: error: Cannot assign to final name "TEN" [misc] +qualifiers_final_annotation.py:190: error: Cannot assign to final name "PI" [misc] """ diff --git a/conformance/tests/qualifiers_final_annotation.py b/conformance/tests/qualifiers_final_annotation.py index 822ea564a..2aed482af 100644 --- a/conformance/tests/qualifiers_final_annotation.py +++ b/conformance/tests/qualifiers_final_annotation.py @@ -24,6 +24,26 @@ # > This is allowed only in __init__ methods, so that the final instance # > attribute is assigned only once when an instance is created. +# > A final name must never be *reassigned*. There may be multiple +# > assignments to a final name, as long as at most one assignment can +# > be reached at runtime +def random() -> bool: + raise NotImplementedError + +ID3: Final[int] + +if random(): + ID3 = 1 +else: + ID3 = 2 # OK + +ID4: Final[int] # E: not exhaustive assignment + +if random(): + ID4 = 1 + +ID5: Final[int] # E: no assignments + class ClassA: ID1: Final = 1 diff --git a/docs/spec/qualifiers.rst b/docs/spec/qualifiers.rst index 6814692e0..f9d1a7d97 100644 --- a/docs/spec/qualifiers.rst +++ b/docs/spec/qualifiers.rst @@ -114,9 +114,11 @@ The two main rules for defining a final name are: a given attribute. There can't be separate class-level and instance-level constants with the same name. -* There must be *exactly one* assignment to a final name. +* A final name must never be *reassigned*. There may be multiple + assignments to a final name, as long as only one can + be reached at runtime (e.g. in an ``if``/``else``` branch) -This means a type checker should prevent further assignments to final +This means a type checker should prevent reassignments to final names in type-checked code:: from typing import Final @@ -129,6 +131,15 @@ names in type-checked code:: RATE = 300 # Error: can't assign to final attribute Base.DEFAULT_ID = 1 # Error: can't override a final attribute +A single assignment in exhaustive branches is not a reassignment:: + + x: Final[int | str] + + if random_bool(): + x = 1 + else: + x = 2 # Okay: assignment is exhaustive and is not reassigned + Note that a type checker need not allow ``Final`` declarations inside loops since the runtime will see multiple assignments to the same variable in subsequent iterations.