The following produces NameError: name 'Client' is not defined
. How can I solve it?
class Server():
def register_client(self, client: Client)
pass
class Client():
def __init__(self, server: Server):
server.register_client(self)
You can use a forward reference by using a string name for the not-yet-defined
Client
class:As of Python 3.7, you can also postpone all runtime parsing of annotations by adding the following
__future__
import at the top of your module:at which point the annotations are stored as string representations of the abstract syntax tree for the expression; you can use
typing.get_type_hints()
to resolve those (and resolve forward references as used above).See PEP 563 -- Postponed Evaluation of Annotations for details; this behaviour will be the default in Python 4.0.
If you are on Python 3.7+, use
from __future__ import annotations
as mentioned in another answer. However, if you cannot use 3.7 yet due to OS limitation (like Cygwin as of 2019-06-03), you can use typing module to satisfy these types of forward/circular dependency issues.Pardon the contrived example but this should illustrate the usefulness of this methodology.