Exceptions are just specific types of classes. Class names are simply what they are defined as. Forbidding classes to have the same name would brake lots of coding schemes. One such example actually works on exceptions: programs that need to be backwards compatible with python2.6 will often override subprocess.CalledProcessError to conform to the python2.7/3.X interface.
How can you have two exceptions of the same name but different subclassing? You are for example free to do the following:
class ExceptoPatronum(KeyError):
pass
KExcept = ExceptoPatronum
class ExceptoPatronum(OSError):
pass
OExcept = ExceptoPatronum
The classes are named the same but neither equal nor instances of each other:
print(KExcept.__name__)
print(OExcept.__name__)
print(KExcept == OExcept, KExcept is OExcept)
This is a (contrived) example that runs even with just one file. However, imagine you have two separate modules which each define their own custom class with the same name, let's say ResourceUnavailable.
As long as they are separate, why should users be warned about such internals? If another module relies on both, would you require it to replace them? It would be a nightmare to track such name collisions.