That is, centralized packaging systems rely on a central
authority to resolve issues of who provides what and obsoletes
what; there's an implicit "x obsoletes y [by decree of
semi-independent third-party z]".
However, in Python package metadata, it's "x obsoletes y [by
decree of x]". IMO, this should be reversed to, "Y is
obsoleted by x [by decree of y]", and "installing Y will
conflict with X [by decree of X]", so that in each case the
scope of authority for the statement is clear.
That is, in each case (conflict or obsolescence), the
project's developers are declaring under what conditions they
will not be supporting an installation. In the case of
obsolescence, the developer is saying, "this is being phased
out, you should use that other thing instead". In the case of
forks, the developer is saying, "If you install both versions,
something's gonna break."
Note that installation conflict is a more conservative claim
anyway: a conflict between forked "foobar" packages is
permanent, in the sense that it doesn't matter what versions
of both packages you're interested in: they both want to
install a foobar/__init__.py. (Of course, installers can and
should detect that condition automatically, but not until they
download the package first.)