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: calendar.nextmonth and calendar.prevmonth functions doesn't check if the month is valid
Type: Stage: resolved
Components: Library (Lib) Versions:
process
Status: closed Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: asocia, belopolsky, p-ganssle, rhettinger, serhiy.storchaka, thatiparthy
Priority: normal Keywords: patch

Created on 2018-12-04 10:55 by asocia, last changed 2022-04-11 14:59 by admin. This issue is now closed.

Pull Requests
URL Status Linked Edit
PR 10890 closed asocia, 2018-12-04 10:56
Messages (12)
msg331031 - (view) Author: Şahin (asocia) * Date: 2018-12-04 10:55
import calendar
calendar.nextmonth(2018, 11) returns (2018, 12) which is OK.
calendar.nextmonth(2018, 12) returns (2019, 1) which is also OK.
calendar.nextmonth(2018, 13) returns (2018, 14). It would make more sense if this was raise calendar.IllegalMonthError.
msg331032 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2018-12-04 11:06
prevmonth() and nextmonth() are internal functions. They are used only in itermonthdays3(), and the month is already checked before calling them.
msg331035 - (view) Author: Şahin (asocia) * Date: 2018-12-04 11:35
I understand you but i still think these functions need to check it. As an end-user, I shouldn't see these functions to work with no errors for illegal months.
msg331037 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2018-12-04 12:07
What is the problem with current code? Can you provide an example that doesn't work correctly?
msg331042 - (view) Author: Şahin (asocia) * Date: 2018-12-04 13:14
I'm suggesting this idea to consistency. Why an IllegalMonthError exists in calendar module if we don't raise this error when required?

What would you say if I asked you to "What is the month number coming after 156th month?" Would you say 157 or prefer to inform me that I'm doing something wrong?

>>> import calendar
>>> calendar.nextmonth(2018, 12)
(2019, 1)

If Python is smart enough to jump next year's first month and not say (2018, 13) blindly, it should also check if the given month is valid. 

But:
>>> calendar.nextmonth(2018, 157)
(2018, 158)

I think this is clearly a bug in the code.


---------------------------------------------------

I'll wander away from the this issue but some of the functions in calendar module also not consistent with each other:

>>> calendar.monthcalendar(2018, 12) # Runs with no problem.
>>> calendar.monthcalendar(2018, 0)  # Raises IllegalMonthError.
>>> calendar.monthcalendar(2018, 13) # Raises IllegalMonthError.

>>> calendar.month(2018, 12) # Runs with no problem.
>>> calendar.month(2018, 0)  # Raises IllegalMonthError.
>>> calendar.month(2018, 13) # Raises IndexError???

Why? Wouldn't it be more reasonable if the last one also had raised IllegalMonthError? 

>>> calendar.monthrange(2018, 12) # Runs with no problem.
>>> calendar.monthrange(2018, 0)  # Raises IllegalMonthError.
>>> calendar.monthrange(2018, 13) # Raises IllegalMonthError.

>>> calendar.prmonth(2018, 12) # Runs with no problem.
>>> calendar.prmonth(2018, 0)  # Raises IllegalMonthError.
>>> calendar.prmonth(2018, 13) # Raises IndexError.
msg331046 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2018-12-04 13:41
nextmonth() is not a public API. You should not use it.

If you want to make IllegalMonthError be always raised instead of IndexError for out of range month values, this is a different issue.
msg331050 - (view) Author: Srinivas Reddy Thatiparthy(శ్రీనివాస్ రెడ్డి తాటిపర్తి) (thatiparthy) * Date: 2018-12-04 15:06
I agree with Serhiy, nextmonth() is not a public API,you should not use it.
msg331052 - (view) Author: Şahin (asocia) * Date: 2018-12-04 15:27
OK now it isn't a problem if we shouldn't use this function directly but how am i going to understand if a function is public API or not? In classes, we are using single or double underscore to indicate that the function or variable we're declaring is intended to be private. Is there anything similar to this for "public API functions" or am I in the wrong way?
msg331053 - (view) Author: Alexander Belopolsky (belopolsky) * (Python committer) Date: 2018-12-04 15:32
> On Dec 4, 2018, at 10:27 AM, Şahin <report@bugs.python.org> wrote:
> 
> Is there anything similar to this for "public API functions"?

Yes - read the reference manual. If the function is not there it is not public.
msg331054 - (view) Author: Paul Ganssle (p-ganssle) * (Python committer) Date: 2018-12-04 15:37
Might it be worth moving `nextmonth` and `prevmonth` to `calendar._nextmonth` and `calendar._prevmonth` to make it more clear that these are private methods?

Due to Hyrum's Law, people will be using them anyway, but it could have a short deprecation period where `calendar.nextmonth` and `calendar.prevmonth` raise DeprecationWarning and then call `calendar._nextmonth` and `calendar._prevmonth`.
msg331057 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2018-12-04 15:44
They are not in the __all__ list and are not documented. If __all__ is defined for the module, there is no need to use the underscore prefix for private globals. The calendar module is not special, many other modules follow this convention.
msg331072 - (view) Author: Şahin (asocia) * Date: 2018-12-04 19:18
OK, thank you all for information. It's now clear for me too why this is not an issue. I'll try to close this issue by selecting status as close but if it isn't working with this way (I'm new, I don't know how) anyone can close this.
History
Date User Action Args
2022-04-11 14:59:08adminsetgithub: 79587
2018-12-04 19:18:30asociasetstatus: open -> closed

messages: + msg331072
stage: patch review -> resolved
2018-12-04 15:44:19serhiy.storchakasetmessages: + msg331057
2018-12-04 15:37:16p-gansslesetnosy: + p-ganssle
messages: + msg331054
2018-12-04 15:32:05belopolskysetmessages: + msg331053
2018-12-04 15:27:11asociasetmessages: + msg331052
2018-12-04 15:06:01thatiparthysetnosy: + thatiparthy
messages: + msg331050
2018-12-04 13:41:12serhiy.storchakasetmessages: + msg331046
2018-12-04 13:14:45asociasetmessages: + msg331042
2018-12-04 12:07:44serhiy.storchakasetmessages: + msg331037
2018-12-04 11:35:47asociasetmessages: + msg331035
2018-12-04 11:06:56serhiy.storchakasetnosy: + rhettinger, serhiy.storchaka, belopolsky
messages: + msg331032
2018-12-04 10:56:06asociasetkeywords: + patch
stage: patch review
pull_requests: + pull_request10128
2018-12-04 10:55:26asociacreate