:class:`~ForwardRef`. The string may not be exactly equivalent
to the original source.
- .. method:: evaluate(*, globals=None, locals=None, type_params=None, owner=None)
+ .. method:: evaluate(*, owner=None, globals=None, locals=None, type_params=None)
Evaluate the forward reference, returning its value.
This may throw an exception, such as :exc:`NameError`, if the forward
- reference refers to names that do not exist. The arguments to this
+ reference refers to a name that cannot be resolved. The arguments to this
method can be used to provide bindings for names that would otherwise
be undefined.
+ The *owner* parameter provides the preferred mechanism for passing scope
+ information to this method. The owner of a :class:`~ForwardRef` is the
+ object that contains the annotation from which the :class:`~ForwardRef`
+ derives, such as a module object, type object, or function object.
+
+ The *globals*, *locals*, and *type_params* parameters provide a more precise
+ mechanism for influencing the names that are available when the :class:`~ForwardRef`
+ is evaluated. *globals* and *locals* are passed to :func:`eval`, representing
+ the global and local namespaces in which the name is evaluated.
+ The *type_params* parameter is relevant for objects created using the native
+ syntax for :ref:`generic classes <generic-classes>` and :ref:`functions <generic-functions>`.
+ It is a tuple of :ref:`type parameters <type-params>` that are in scope
+ while the forward reference is being evaluated. For example, if evaluating a
+ :class:`~ForwardRef` retrieved from an annotation found in the class namespace
+ of a generic class ``C``, *type_params* should be set to ``C.__type_params__``.
+
:class:`~ForwardRef` instances returned by :func:`get_annotations`
retain references to information about the scope they originated from,
so calling this method with no further arguments may be sufficient to
means may not have any information about their scope, so passing
arguments to this method may be necessary to evaluate them successfully.
- *globals* and *locals* are passed to :func:`eval`, representing
- the global and local namespaces in which the name is evaluated.
- *type_params*, if given, must be a tuple of
- :ref:`type parameters <type-params>` that are in scope while the forward
- reference is being evaluated. *owner* is the object that owns the
- annotation from which the forward reference derives, usually a function,
- class, or module.
-
.. important::
Once a :class:`~ForwardRef` instance has been evaluated, it caches
* Supports the :attr:`~annotationlib.Format.FORWARDREF` and
:attr:`~annotationlib.Format.STRING` formats.
- *forward_ref* must be an instance of :class:`~annotationlib.ForwardRef`.
- *owner*, if given, should be the object that holds the annotations that
- the forward reference derived from, such as a module, class object, or function.
- It is used to infer the namespaces to use for looking up names.
- *globals* and *locals* can also be explicitly given to provide
- the global and local namespaces.
- *type_params* is a tuple of :ref:`type parameters <type-params>` that
- are in scope when evaluating the forward reference.
- This parameter must be provided (though it may be an empty tuple) if *owner*
- is not given and the forward reference does not already have an owner set.
+ See the documentation for :meth:`annotationlib.ForwardRef.evaluate` for
+ the meaning of the *owner*, *globals*, *locals*, and *type_params* parameters.
*format* specifies the format of the annotation and is a member of
the :class:`annotationlib.Format` enum.
def test_evaluate_forward_ref_no_type_params(self):
ref = ForwardRef('int')
- with self.assertWarnsRegex(
- DeprecationWarning,
- (
- "Failing to pass a value to the 'type_params' parameter "
- "of 'typing.evaluate_forward_ref' is deprecated, "
- "as it leads to incorrect behaviour"
- ),
- ):
- typing.evaluate_forward_ref(ref)
-
- # No warnings when `type_params` is passed:
- with warnings.catch_warnings(record=True) as w:
- typing.evaluate_forward_ref(ref, type_params=())
- self.assertEqual(w, [])
+ self.assertIs(typing.evaluate_forward_ref(ref), int)
class CollectionsAbcTests(BaseTestCase):
owner=None,
globals=None,
locals=None,
- type_params=_sentinel,
+ type_params=None,
format=annotationlib.Format.VALUE,
_recursive_guard=frozenset(),
):
infer the namespaces to use for looking up names. *globals* and *locals*
can also be explicitly given to provide the global and local namespaces.
*type_params* is a tuple of type parameters that are in scope when
- evaluating the forward reference. This parameter must be provided (though
+ evaluating the forward reference. This parameter should be provided (though
it may be an empty tuple) if *owner* is not given and the forward reference
does not already have an owner set. *format* specifies the format of the
annotation and is a member of the annotationlib.Format enum.
"""
- if type_params is _sentinel:
- _deprecation_warning_for_no_type_params_passed("typing.evaluate_forward_ref")
- type_params = ()
if format == annotationlib.Format.STRING:
return forward_ref.__forward_arg__
if forward_ref.__forward_arg__ in _recursive_guard: