Home > Software design >  Why set.discard doesn't throw an error when a set is passed to it in Python?
Why set.discard doesn't throw an error when a set is passed to it in Python?

Time:01-13

My question is quite simple.

When I run

someSet = {1,2,3,4}
someSet.discard([5])

It gives the error:

Traceback (most recent call last):
  File "File.py", line 2, in <module>
    someSet.discard([5])
TypeError: unhashable type: 'list'

Just like list, sets are also unhashable and can't be stored in a set. So, I expect the following code to generate an error:

someSet = {1,2,3,4}
someSet.discard({5})

But to my surprise, it did not generate any error. Why is it so? Does this mean that I am getting an error for list as there something other than it being unhashable which gives rise to the error? If yes, then what is that thing?

CodePudding user response:

There's a weird special case where if you pass another set to set.remove, set.discard, or x in set, the set is silently converted to a frozenset.

Note, the elem argument to the __contains__(), remove(), and discard() methods may be a set. To support searching for an equivalent frozenset, a temporary one is created from elem.

  • Related