Home  >  Article  >  Backend Development  >  How to Resolve Circular Dependencies in Python\'s Type Hints?

How to Resolve Circular Dependencies in Python\'s Type Hints?

Susan Sarandon
Susan SarandonOriginal
2024-10-21 21:48:31537browse

How to Resolve Circular Dependencies in Python's Type Hints?

Type Hints: Resolving Circular Dependency

In Python, circular dependencies can arise when two classes mutually reference each other in their type hints. This results in a NameError when attempting to instantiate one of the classes.

Consider the following example:

<code class="python">class Server:
    def register_client(self, client: Client)
        pass


class Client:
    def __init__(self, server: Server):
        server.register_client(self)</code>

Attempting to instantiate Client will fail with a NameError: name 'Client' is not defined.

Using Forward References

One way to resolve this circular dependency is to use a forward reference in the type hint. This is done by providing a string name for the class that has not yet been defined:

<code class="python">class Server:
    def register_client(self, client: 'Client')
        pass</code>

Postponing Annotation Parsing

Another solution introduced in Python 3.7 is to postpone runtime parsing of annotations entirely. This is achieved by adding the following import at the top of the module:

<code class="python">from __future__ import annotations</code>

With annotations parsing postponed, the annotations are stored as string representations of the abstract syntax tree (AST) for the expression. You can use typing.get_type_hints() to resolve these annotations and resolve forward references as used in the previous example.

For further details, refer to PEP 563: Postponed Evaluation of Annotations.

The above is the detailed content of How to Resolve Circular Dependencies in Python\'s Type Hints?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn