aisk / pick

create curses based interactive selection list in the terminal
MIT License
721 stars 60 forks source link

Pick no longer works with lists that contain a dictionary #120

Closed gyang2300 closed 4 months ago

gyang2300 commented 4 months ago

After upgrading to the latest pick, the following doesn't work anymore. It used to work in the previous version.

This was tested on Mac Sonoma 14.4.1 / python 3.11.5 / pick 2.3.0

!/usr/bin/env python3

from pick import pick

title = 'Please choose your favorite programming language: ' options = [{'Language':'Java'}, {'Language':'JavaScript'}, {'Language':'Python'}, {'Language':'PHP'}, {'Language':'C++'}, {'Language':'Erlang'}, {'Language':'Haskell'}] option, index = pick(options, title) print(option) print(option["Language"]) print(index)

aisk commented 4 months ago

Hi @gyang2300, thanks for the report.

I can reproduce the issue with this code (most the same as you posted):

from pick import pick

options = [{'Language':'Java'}, {'Language':'JavaScript'}, {'Language':'Python'}, {'Language':'PHP'}, {'Language':'C++'}, {'Language':'Erlang'}, {'Language':'Haskell'}]
print(pick(options))

But I think this is a misuse because passing a list of dictionaries to pick is unexpected and weired. Since pick has type hints, you can run mypy or pyright, and you will get these complaints:

a.py:5: error: Value of type variable "OPTION_T" of "pick" cannot be "Dict[str, str]"  [type-var]
Found 1 error in 1 file (checked 1 source file)

Modern IDEs like pycharm and vscode will warn you.

However, this break is easy to fix and won't involve too much impact to the code base, so I'll fix it and release a new version.

aisk commented 4 months ago

See v2.3.1.