This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Improve documentation about tzinfo.dst(None)
Type: Stage:
Components: Documentation Versions:
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: docs@python Nosy List: Daniel Moisset, belopolsky, docs@python
Priority: normal Keywords:

Created on 2016-10-07 16:50 by Daniel Moisset, last changed 2022-04-11 14:58 by admin.

Messages (2)
msg278256 - (view) Author: Daniel Moisset (Daniel Moisset) * Date: 2016-10-07 16:50
The datetime module documentation[1] describes the tzinfo.dst method with a single "dt" argument without being too explicit about possible values for it. The implication is that dt should be a datetime object, but the implementation of time.dst() [2] actually calls tz.dst(None) (where tz is an instance of some tzinfo subclass), so this should clarify that None is an allowed value.

Also, some of the examples given below in the same document (like LocalTimezone, GMT1, GMT2) actually have a related bug (it doesn't handle a None value correctly). So running

>>> ... # copy the example from the documentation
>>> t = time(tzinfo=LocalTimeZone())
>>> t.dst()

crashes with an AttributeError: 'NoneType' object has no attribute 'year'. This kind of bugs have propagated to some other projects already [2]. Some of the other examples (like USTimeZone) seem to be OK

What I think would be desirable here is:
 * A clarification on https://docs.python.org/3.5/library/datetime.html#datetime.tzinfo.dst indicating that dt is either a datetime or a None, in which situations it can be None, and what is the method supposed to return in this case.
 * Fixes in the code examples that reflect this

I would offer a patch, but I'm not quite sure of what the desired behaviour is so I wouldn't know what to document :)

[1] https://docs.python.org/3.5/library/datetime.html
[2] https://github.com/python/cpython/blob/master/Modules/_datetimemodule.c#L3623
[3] https://github.com/django/django/blob/1.10.2/django/utils/timezone.py#L111
msg278258 - (view) Author: Alexander Belopolsky (belopolsky) * (Python committer) Date: 2016-10-07 17:55
None is passed to tzinfo.dst() when it is called from time.dst() method.  This is documented in the relevant section: <https://docs.python.org/3.5/library/datetime.html#datetime.time.dst>.

I am not sure whether if it is worth repeating in the abstract tzinfo class documentation, but if we do, the same should be done for the utcoffset() and tzname() methods which also get None when called from namesake time methods.

While we are at it, we should also do something about "If utcoffset() does not return None, dst() should not return None either." mandate in the tzinfo.utcoffset() documentation. See <https://docs.python.org/3.5/library/datetime.html#datetime.tzinfo.utcoffset>.  This mandate is violated by the datetime.timezone class.
History
Date User Action Args
2022-04-11 14:58:38adminsetgithub: 72572
2016-10-07 17:55:11belopolskysetmessages: + msg278258
2016-10-07 17:37:41r.david.murraysetnosy: + belopolsky
2016-10-07 16:50:32Daniel Moissetcreate