Skip to content

Allow Final attributes declared in class body if initialized in ctor #8982

Description

@llchan

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.

Metadata

Metadata

Assignees

No one assigned

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions