[Guido]
... The conventional value of one hour of is never implied in any of these calculations -- that's always up to the tzinfo object.
This is so.
(However, it's assumed that dst() returns a positive number -- otherwise it wouldn't be daylight *savings*. On the southern hemisphere, the seasons are reversed, but DST still moves the clock forward by some amount, not back.)
If you dig into the long new correctness proof, you'll find that the astimezone() implementation doesn't actually need the assumption that dst() returns a positive number. It does rely on the sanity requirement that dst() return a non-zero result if and only if daylight time is in effect, and on the subtler consistency requirement that dt.tzinfo.utcoffset(dt) - dt.tzinfo.dst(dt) is a fixed value across all datetimetz dt with the same dt.year member (hmm -- I think I'm assuming there too that a DST switch doesn't occur within a day or so of Jan 1). The flexibility to rely on only one-year-at-a-time consistency is important for people who need to model that Chile delayed its changeover date for the Pope's visit in 1987 <wink>.