This rule raises an issue when a dictionary unpacking operation is performed on an invalid mapping object.

== Why is this an issue?

Dictionary unpacking allows you to pass the key-value pairs of a dictionary as keyword arguments to a function or merge dictionaries:
[source,python]
----
def foo(a, b):
    print(a+b)

my_dict = {"a": 1, "b": 2}
foo(**my_dict) # will print 3
----

Dictionary unpacking requires an object with methods ``++__getitem__++`` and ``++keys++`` or ``++__getitem__++`` and ``++__getattr__++``. This is the case for any https://docs.python.org/3/glossary.html#term-mapping[mapping] object such as ``++dict++``. Using an object which doesn't have these methods will raise a ``++TypeError++``.

=== Code examples

==== Noncompliant code example

[source,python,diff-id=1,diff-type=noncompliant]
----
class A:
    pass

{'a': 10, 'b': 20, **A()}  # Noncompliant
----


==== Compliant solution

[source,python,diff-id=1,diff-type=compliant]
----
class A:
  def __getitem__(self, key):
      return 2

  def keys(self):
      return ['1','2','3']

{'a': 10, 'b': 20, **A()}  # => {'a': 10, 'b': 20, '1': 2, '2': 2, '3': 2}
----

== Resources

=== Documentation

* Python Documentation - https://docs.python.org/3/glossary.html#term-mapping[mapping]

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

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

=== Message

X is of type Y and cannot be unpacked with "**". Use a "mapping" object instead.


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