You can write a setup.py with no version information specified, and vcversioner will find a recent, properly-formatted VCS tag and extract a version from it. It's much more convenient to be able to use your version control system's tagging mechanism to derive a version number than to have to duplicate that information all over the place. I eventually ended up copy-pasting the same code into a couple different setup.py files just to avoid duplicating version information. But, copy-pasting is dumb and unit testing setup.py files is hard. This code got factored out into vcversioner.