This rule raises an issue when a function or method returns a value that contradicts its type hint.

== Why is this an issue?

Developers can use type hints to specify which type a function is expected to return. Doing so improves maintainability since it clarifies the contract of the function, making it easier to use and understand.

When annotating a function with a specific type hint, it is expected that the returned value matches the type specified in the hint.

If the type hint specifies a class or a named type, then the value returned should be an instance of that class or type. If the type hint specifies a structural type, then the value returned should have the same structure as the type hint.

In the following example, while `Bucket` does not directly inherit from `Iterable`, it does implement the `Iterable` protocol thanks to its ``++__iter__++`` method and can therefore be used as a valid `Iterable` return type.

[source,python]
----
from collections.abc import Iterator, Iterable

class Bucket:  # Note: no base classes
    ...
    def __len__(self) -> int: ...
    def __iter__(self) -> Iterator[int]: ...


def collect() -> Iterable: return Bucket()
----

Since type annotations are not enforced at runtime, returning a completely different type might not fail. It is however likely to be unintended and will lead to maintainability issues, if not bugs.

== How to fix it

=== Code examples

To fix this issue, make sure that the returned value of your function is compatible with its type hint.

==== Noncompliant code example

[source,python,diff-id=1,diff-type=noncompliant]
----
def hello() -> str:
    return 42  # Noncompliant: Function's type hint asks for a string return value
----


==== Compliant solution

[source,python,diff-id=1,diff-type=compliant]
----
def hello() -> str:
    return "Hello"
----


== Resources

=== Documentation

* Python documentation - https://docs.python.org/3/library/typing.html[Support for type hints]
* PEP 544 - https://peps.python.org/pep-0544/[Protocols: Structural subtyping (static duck typing)]

ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

=== Message

*Return a "XXX" instead of a "YYY" or update function "ZZZ" type hint.


=== Highlighting

* If the function returns the wrong type:
** Primary: The return statement
** Secondaries: 1. the function name, 2. The type hint
* If the function might terminate without reaching a return statement:
** Primary Location: The function name
** Secondary: the type hint


endif::env-github,rspecator-view[]
