There is currently a safety check around TypeVar-dependent Final attributes declared in the class body that I believe we can loosen when the variable is assigned in the ctor. This should work analogously to non-TypeVar-dependent final attributes declared in the class body, which also require an assignment in the ctor (otherwise they emit "Final name must be initialized with a value").
- Are you reporting a bug, or opening a feature request? feature request
- Please insert below the code you are checking with mypy,
or a mock-up repro if the source is private. We would appreciate
if you try to simplify your case to a minimal repro.
from typing import Final, Generic, TypeVar
WidgetT = TypeVar('WidgetT', bound='Widget')
class Widget:
pass
class WidgetHolder(Generic[WidgetT]):
widget: Final[WidgetT]
def __init__(self, widget: WidgetT) -> None:
self.widget = widget
- What is the actual behavior/output?
final.py: note: In class "WidgetHolder":
final.py:13:5: error: Final name declared in class body cannot depend on type variables [misc]
widget: Final[WidgetT]
^
In case anyone comes across this issue, the workaround is currently to not declare in the class body, but declare in the ctor with self.widget: Final[WidgetT] = widget instead. But just because a workaround exists doesn't mean we shouldn't try to fix this.
There is currently a safety check around
TypeVar-dependentFinalattributes declared in the class body that I believe we can loosen when the variable is assigned in the ctor. This should work analogously to non-TypeVar-dependent final attributes declared in the class body, which also require an assignment in the ctor (otherwise they emit "Final name must be initialized with a value").or a mock-up repro if the source is private. We would appreciate
if you try to simplify your case to a minimal repro.
In case anyone comes across this issue, the workaround is currently to not declare in the class body, but declare in the ctor with
self.widget: Final[WidgetT] = widgetinstead. But just because a workaround exists doesn't mean we shouldn't try to fix this.