Title: Turn SIG_DFL and SIG_IGN into functions
Type: enhancement Stage: patch review
Components: Library (Lib) Versions: Python 3.10
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: barry, eli.bendersky, giampaolo.rodola, serhiy.storchaka, vstinner, xiang.zhang
Priority: normal Keywords: patch

Created on 2015-01-26 20:38 by serhiy.storchaka, last changed 2020-06-28 11:04 by serhiy.storchaka.

File name Uploaded Description Edit
signal_std_handlers.patch serhiy.storchaka, 2015-01-26 20:38 review
Pull Requests
URL Status Linked Edit
PR 8920 open serhiy.storchaka, 2018-08-25 10:41
Messages (7)
msg234775 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2015-01-26 20:38
In C the SIG_DFL and SIG_IGN macros expand into integral expressions that are not equal to an address of any function. In Python they are int objects with platform depended values. Second argument of the signal() function should be SIG_DFL, SIG_IGN, or a function. The getsignal() function returns SIG_DFL, SIG_IGN, None, or a function. They are tested for identity in signal() and getsignal() returns identical values. So actually SIG_DFL and SIG_IGN are just singletons.

I propose to turn SIG_DFL and SIG_IGN into functions. Benefits:

1. They will have names and self-descriptive representation.
2. They will have docstrings.
3. The signature of signal() will be simpler. The type of second argument would be function.
4. Their pickling will be portable.

This patch depends on the backout of turning these constants to enums (issue21076).
msg238327 - (view) Author: Ethan Furman (ethan.furman) * (Python committer) Date: 2015-03-17 18:13
A private method is being added to Enum to better support Enum replacement of constants, part of which includes changing __reduce_ex__ to return the string of the name.

These changes answer points 1 and 4.

Point 2 would be nice, but seems somewhat less important if Enums are being used.

Point 3 -- I don't see how 'Signal(xxx, yyy)' is more complicated than 'Signal(xxx, zzz)'?
msg238495 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2015-03-19 07:17
Currently the action parameter of signal.signal() can be SIG_DFL, SIG_IGN, or a callable Python object. Would be just a callable Python object. This is simpler.

The main benefit is that they will be better look in pydoc output.
msg238538 - (view) Author: Ethan Furman (ethan.furman) * (Python committer) Date: 2015-03-19 15:51
Thanks for the explanation, point taken.

However, it seems to me that changing the type of the constants from 'int' to 'function' is backwards incompatible, will break code, and is probably not worth it (and would require a deprecation period if it was worth it).

I still think the better answer is to delve into Modules/signalmodule.c and fix the comparisons.
msg324075 - (view) Author: Xiang Zhang (xiang.zhang) * (Python committer) Date: 2018-08-25 16:26
I'm afraid this could break old codes so not sure it's worth or not. I've seen code like `SIGTERM = 15; signal.signal(SIGTERM, handler)`. I won't be surprised to see a handcraft SIG_DFL/IGN.
msg324084 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2018-08-25 17:42
Numerical values of signal numbers are standardized. signal.signal(15, handler) is valid. SIGTERM is just a handy name for the constant 15.

But SIG_DFL and SIG_IGN are not integers in C (they are special pointers), and it is not declared anywhere that they should be integers in Python. The code that converts them to Python integer is implementation depending (PyLong_FromVoidPtr). Handcrafted SIG_DFL and SIG_IGN are broken by design, because the signal module uses identity comparison for SIG_DFL and SIG_IGN.
msg324096 - (view) Author: Xiang Zhang (xiang.zhang) * (Python committer) Date: 2018-08-25 19:36
I miss that. So this change seems to be user transparent and make more sense then.
Date User Action Args
2020-06-28 11:04:39serhiy.storchakasetversions: + Python 3.10, - Python 3.8
2018-08-25 19:36:50xiang.zhangsetnosy: + vstinner
messages: + msg324096
2018-08-25 17:42:29serhiy.storchakasetmessages: + msg324084
2018-08-25 16:26:34xiang.zhangsetnosy: + xiang.zhang

messages: + msg324075
versions: + Python 3.8, - Python 3.5
2018-08-25 10:41:14serhiy.storchakasetpull_requests: + pull_request8393
2015-07-21 08:13:33ethan.furmansetnosy: - ethan.furman
2015-03-19 15:51:50ethan.furmansetmessages: + msg238538
2015-03-19 07:17:04serhiy.storchakasetmessages: + msg238495
2015-03-17 18:13:15ethan.furmansetnosy: + barry, eli.bendersky
messages: + msg238327
2015-01-26 20:38:30serhiy.storchakacreate