Home > Mobile >  How to correctly use typing for a sort key function
How to correctly use typing for a sort key function

Time:11-30

For this sort key method:

def srt(self,r:Optional[Colour])->Optional[int]:
  if not isinstance(r,Colour):
    return None
  return r.index

used in a later method in the same class (NOT Colour):

items=sorted(self.__dict__.values(),key=self.srt)

results in this error from mypy:

error: Argument "key" to "sorted" has incompatible type "Callable[[Optional[Colour]], Optional[int]]"; expected "Callable[[Any], SupportsLessThan]"  [arg-type]

I can make it shut up by either forcing srt() to the signature it wants, or by doing a type: ignore on the call to sorted. But I'd rather do it right.

I'm clearly doing something wrong, but what? Even if there is no good way to do this, I want to know why mypy is complaining.

CodePudding user response:

You are passing a function that returns Optional[int] but a function is required that returns SupportsLessThan. Optional[int] does not support "less than", because None cannot be compared to any int.

What does support "less than" is just int. So you could change the return type of your function to int and make it return some integer in the special case that r is not a Colour, instead of None.

Which integer it should return in this case depends on what you are trying to achieve. Possibly you could return -1 in case you want any non-Colour values to be sorted before any Colour values, since that would be smaller than any value of r.index (at least that's what I expect from something called "index").

  • Related