mypy question

Karsten Hilbert Karsten.Hilbert at gmx.net
Fri Dec 29 10:02:01 EST 2023


Am Fri, Dec 29, 2023 at 07:49:17AM -0700 schrieb Mats Wichmann via Python-list:

> >I am not sure why mypy thinks this
> >
> >gmPG2.py:554: error: Argument "queries" to "run_rw_queries" has incompatible type "List[Dict[str, str]]"; expected
> >"List[Dict[str, Union[str, List[Any], Dict[str, Any]]]]"  [arg-type]
> >                     rows, idx = run_rw_queries(link_obj = conn, queries = queries, return_data = True)
> >                                                                           ^~~~~~~
> >
> >should be flagged. The intent is for "queries" to be
> >
> >a list
> >	of dicts
> >		with keys of str
> >		and values of
> >			str OR
> >			list of anything OR
> >			dict with
> >				keys of str
> >				and values of anything
> >
> >I'd have thunk list[dict[str,str]] matches that ?
>
> Dict[str, str] means the key type and value type should both be strings,

Indeed, I know that much, list[dict[str, str]] is what is getting
passed in in this particular invocation of run_rw_queries().

For what it's worth here's the signature of that function:

	def run_rw_queries (
		link_obj:_TLnkObj=None,
		queries:list[dict[str, str | list | dict[str, Any]]]=None,
		end_tx:bool=False,
		return_data:bool=None,
		get_col_idx:bool=False,
		verbose:bool=False
	) -> tuple[list[dbapi.extras.DictRow], dict[str, int] | None]:

Given that I would have thought that passing in
list[dict[str, str]] for "queries" ought to be type safe.
Mypy indicates otherwise which I am not grokking as to why.

> but in your
> retelling above you indicate lots of possible value types... actually the mypy guess
> seems to be a pretty good recreation of your psuedo-code description.

I agree that mypy's grasp of my intent from

	queries:list[dict[str, str | list | dict[str, Any]]]=None,

into

	"List[Dict[str, Union[str, List[Any], Dict[str, Any]]]]"

seems accurate. I just don't understand why list[dict[str,
str]] should not pass that construct.

Karsten
--
GPG  40BE 5B0E C98E 1713 AFA6  5BC0 3BEA AC80 7D4F C89B


More information about the Python-list mailing list