You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
>>> import inquirer
>>> test = [('aa', {'a': 1}), ('bb', {'b':2})]
>>> inquirer.list_input('Which?', carousel=True, choices=test)
[?] Which?:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "App/.venv/lib/python3.11/site-packages/inquirer/shortcuts.py", line 32, in list_input
return render.render(question)
^^^^^^^^^^^^^^^^^^^^^^^
File "App/.venv/lib/python3.11/site-packages/inquirer/render/console/__init__.py", line 38, in render
return self._event_loop(render)
^^^^^^^^^^^^^^^^^^^^^^^^
File "App/.venv/lib/python3.11/site-packages/inquirer/render/console/__init__.py", line 49, in _event_loop
self._print_hint(render)
File "App/.venv/lib/python3.11/site-packages/inquirer/render/console/__init__.py", line 96, in _print_hint
hint = render.get_hint()
^^^^^^^^^^^^^^^^^
File "App/.venv/lib/python3.11/site-packages/inquirer/render/console/_list.py", line 23, in get_hint
hint = self.question.hints[choice]
~~~~~~~~~~~~~~~~~~~^^^^^^^^
File "App/.venv/lib/python3.11/site-packages/inquirer/questions.py", line 37, in __hash__
return hash(self.tuple)
^^^^^^^^^^^^^^^^
TypeError: unhashable type: 'dict'
The reason is that TaggedValue's hash function tries to hash whole tuple passed. Would it be enough to hash just the string representation (i.e. hash(self.tag)), instead of the whole tuple? I'd say the list of choices should provide unique string descriptions for every item (although it might technically not be necessary when passing hints= as well?)
The text was updated successfully, but these errors were encountered:
Cube707
changed the title
Tuples with dictionary as list choices no longer works as expected with v3.2.2 - regression from v3.2.1
Tuples as list choices can't be hashed when containing a dict
Feb 3, 2024
Hm, this is a though one. The TaggedValue needs to hash to the same hash-value as the tuple it represents, so that they can be used interchangeably as dict-keys. This is need by the feature introduced in #433 to make tuple-pair and hint compatible.
I agree that it technically shouldn'd need to be hashed if no hints are provided, so I will check that if I find some time.
But as tuples in general repersend immutable data it can usually be assumed that they are hashable and this is not really a regression, instead your usecase only happend to work before due to pythons loose enforcment of such things
In 3.2.1, the following worked:
Whereas in 3.2.2 (and 3.2.3) this doesn't:
The reason is that
TaggedValue
'shash
function tries to hash whole tuple passed. Would it be enough to hash just the string representation (i.e.hash(self.tag)
), instead of the whole tuple? I'd say the list of choices should provide unique string descriptions for every item (although it might technically not be necessary when passinghints=
as well?)The text was updated successfully, but these errors were encountered: