Skip to content

Type of the same class inside the class #3661

Closed

Description

@mrkaspa

I have a method that returns itself but it doesn't know the type of the class inside

class TcpFlow(object):

    def __init__(self) -> None:
        self.matches = []  # type: List[str]

    def __enter__(self) -> TcpFlow:
        return self

I got this error

Traceback (most recent call last):
  File "example/sample.py", line 2, in <module>
    from tcpflow import TcpFlow
  File "/Users/mrkaspa/code/py/tcpflow.py/tcpflow/__init__.py", line 1, in <module>
    from .tcpflow import TcpFlow
  File "/Users/mrkaspa/code/py/tcpflow.py/tcpflow/tcpflow.py", line 8, in <module>
    class TcpFlow(object):
  File "/Users/mrkaspa/code/py/tcpflow.py/tcpflow/tcpflow.py", line 16, in TcpFlow
    def __enter__(self) -> TcpFlow:
NameError: name 'TcpFlow' is not defined

Activity

  1. ilevkivskyi commented on Jul 5, 2017

    @ilevkivskyi
    Member

    In such cases you should put the name of class in quotes (this is called forward reference), like this:

    class TcpFlow(object):
        def __enter__(self) -> 'TcpFlow':
            return self
  2. Garrett-R commented on Jun 23, 2020

    @Garrett-R

    As of Python 3.7, you can now do:

    from __future__ import annotations
    
    class TcpFlow(object):
        def __enter__(self) -> TcpFlow:
            return self

    (notice the quotes around the return type have been removed)

  3. johnthagen commented on Dec 15, 2022

    @johnthagen
    Contributor

    As of Python 3.11, you can now use the Self type to express the intent clearly and concisely:

    from typing import Self
    
    class TcpFlow:
        def __enter__(self) -> Self:
            return self

    This new pattern can be applied to previous versions of Python using typing_extensions.Self backport.


    Note that this removed the need to use:

    from __future__ import annotations

    which is important as the SC has tentatively accepted PEP 649, which indicates the future will be to move away from from __future__ import annotations.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions