Skip to content

Clarify that bisect(a, x, key=...) does not call key(x) #91966

@sean8223

Description

@sean8223

The key functions generated by the functools.cmp_to_key function don't work with bisect.bisect_right or bisect.bisect_left, raising a TypeError with the message "TypeError: other argument must be K instance" when used.

Consider the following example derived from the Sorting HOWTO page (https://docs.python.org/3/howto/sorting.html#the-old-way-using-the-cmp-parameter)

Python 3.10.4 (main, Apr 25 2022, 16:19:06) [GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from functools import cmp_to_key
>>> from bisect import bisect_right, bisect_left
>>> ns=[1,2,3,4,5]
>>> def numeric_compare(x, y):
...     return x - y
... 
>>> bisect_right(ns, 2, key=cmp_to_key(numeric_compare))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: other argument must be K instance
>>> bisect_left(ns, 2, key=cmp_to_key(numeric_compare))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: other argument must be K instance

The methods bisect.insort_left and bisect.insort_right functions do seem work correctly with these key functions:

Python 3.10.4 (main, Apr 25 2022, 16:19:06) [GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from bisect import insort_right, insort_left
>>> from functools import cmp_to_key
>>> def numeric_compare(x, y):
...     return x - y
... 
>>> ns=[1, 2, 3, 4, 5]
>>> insort_right(ns, 2, key=cmp_to_key(numeric_compare))
>>> ns
[1, 2, 2, 3, 4, 5]

Your environment

  • Python version 3.10.4
  • Linux x86

Metadata

Metadata

Assignees

Labels

docsDocumentation in the Doc dirstdlibStandard Library Python modules in the Lib/ directory

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions