<div>HELLO...</div>
<div> </div>
<div>!thank you for all the cooperation and emails send. i would like that you now stop sending them..</div>
<div> </div>
<div>thank you in advance<br><br></div>
<div class="gmail_quote">On Fri, Apr 4, 2014 at 4:22 PM, <span dir="ltr"><<a href="mailto:python-dev-request@python.org" target="_blank">python-dev-request@python.org</a>></span> wrote:<br>
<blockquote style="BORDER-LEFT:#ccc 1px solid;MARGIN:0px 0px 0px 0.8ex;PADDING-LEFT:1ex" class="gmail_quote">Send Python-Dev mailing list submissions to<br>        <a href="mailto:python-dev@python.org">python-dev@python.org</a><br>
<br>To subscribe or unsubscribe via the World Wide Web, visit<br>        <a href="https://mail.python.org/mailman/listinfo/python-dev" target="_blank">https://mail.python.org/mailman/listinfo/python-dev</a><br>or, via email, send a message with subject or body 'help' to<br>
        <a href="mailto:python-dev-request@python.org">python-dev-request@python.org</a><br><br>You can reach the person managing the list at<br>        <a href="mailto:python-dev-owner@python.org">python-dev-owner@python.org</a><br>
<br>When replying, please edit your Subject line so it is more specific<br>than "Re: Contents of Python-Dev digest..."<br><br><br>Today's Topics:<br><br>   1. Re: Pyston: a Python JIT on LLVM (Dag Sverre Seljebotn)<br>
   2. Re: [Python-checkins] cpython: fix #21076: turn signal module<br>      constants into enums (Brett Cannon)<br>   3. Re: [Python-checkins] cpython: fix #21076: turn signal module<br>      constants into enums (Brett Cannon)<br>
<br><br>----------------------------------------------------------------------<br><br>Message: 1<br>Date: Fri, 04 Apr 2014 12:13:53 +0200<br>From: Dag Sverre Seljebotn <<a href="mailto:d.s.seljebotn@astro.uio.no">d.s.seljebotn@astro.uio.no</a>><br>
To: <a href="mailto:python-dev@python.org">python-dev@python.org</a>, <a href="mailto:kmod@dropbox.com">kmod@dropbox.com</a><br>Subject: Re: [Python-Dev] Pyston: a Python JIT on LLVM<br>Message-ID: <<a href="mailto:533E85E1.7050001@astro.uio.no">533E85E1.7050001@astro.uio.no</a>><br>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed<br><br>On 04/04/2014 12:42 AM, Sturla Molden wrote:<br>> Kevin Modzelewski <<a href="mailto:kmod@dropbox.com">kmod@dropbox.com</a>> wrote:<br>><br>>> Since it's the question that I think most people will inevitably (and<br>
>> rightly) ask, why do we think there's a place for Pyston when there's PyPy<br>>> and (previously) Unladen Swallow?<br>><br>> Have you seen Numba, the Python JIT that integrates with NumPy?<br>
><br>> <a href="http://numba.pydata.org/" target="_blank">http://numba.pydata.org</a><br><br>Specifically, Numba compiles to LLVM too, and tries to be somewhat<br>general-purpose although it's tuned to numerical code. And their reason<br>
for not using PyPy is the same: C extensions. So while their "market<br>segment" is different from yours, the technology may not be.<br><br>Dag Sverre<br><br><br>><br>> It uses LLVM to compile Python bytecode. When I have tried it I tend to get<br>
> speed comparable to -O2 in C for numerical and algorithmic code.<br>><br>> Here is an example, giving a 150 times speed boost to Python:<br>><br>> <a href="http://stackoverflow.com/questions/21811381/how-to-shove-this-loop-into-numpy/21818591#21818591" target="_blank">http://stackoverflow.com/questions/21811381/how-to-shove-this-loop-into-numpy/21818591#21818591</a><br>
><br>><br>> Sturla<br>><br>> _______________________________________________<br>> Python-Dev mailing list<br>> <a href="mailto:Python-Dev@python.org">Python-Dev@python.org</a><br>> <a href="https://mail.python.org/mailman/listinfo/python-dev" target="_blank">https://mail.python.org/mailman/listinfo/python-dev</a><br>
> Unsubscribe: <a href="https://mail.python.org/mailman/options/python-dev/d.s.seljebotn%40astro.uio.no" target="_blank">https://mail.python.org/mailman/options/python-dev/d.s.seljebotn%40astro.uio.no</a><br>><br><br>
<br><br>------------------------------<br><br>Message: 2<br>Date: Fri, 4 Apr 2014 10:12:23 -0400<br>From: Brett Cannon <<a href="mailto:brett@python.org">brett@python.org</a>><br>To: python-dev <<a href="mailto:python-dev@python.org">python-dev@python.org</a>><br>
Cc: python-checkins <<a href="mailto:python-checkins@python.org">python-checkins@python.org</a>><br>Subject: Re: [Python-Dev] [Python-checkins] cpython: fix #21076: turn<br>        signal module constants into enums<br>
Message-ID:<br>        <CAP1=2W7Qif5qhND=<a href="mailto:VA%2BrOnt1%2BfGFM75Rp-K9aN0T3oGZweXMUA@mail.gmail.com">VA+rOnt1+fGFM75Rp-K9aN0T3oGZweXMUA@mail.gmail.com</a>><br>Content-Type: text/plain; charset="utf-8"<br>
<br>This broke compilation on at least OS X, but I'm willing to bet for all<br>UNIX-based systems. I have a fix in the works.<br><br><br>On Fri, Apr 4, 2014 at 9:34 AM, giampaolo.rodola <<a href="mailto:python-checkins@python.org">python-checkins@python.org</a><br>
> wrote:<br><br>> <a href="http://hg.python.org/cpython/rev/c9239171e429" target="_blank">http://hg.python.org/cpython/rev/c9239171e429</a><br>> changeset:   90128:c9239171e429<br>> user:        Giampaolo Rodola' <<a href="mailto:g.rodola@gmail.com">g.rodola@gmail.com</a>><br>
> date:        Fri Apr 04 15:34:17 2014 +0200<br>> summary:<br>>   fix #21076: turn signal module constants into enums<br>><br>> files:<br>>   Doc/library/signal.rst   |  10 +++<br>>   Doc/whatsnew/3.5.rst     |   5 +<br>
>   Lib/signal.py            |  84 ++++++++++++++++++++++++++++<br>>   Lib/test/test_doctest.py |   2 +-<br>>   Lib/test/test_signal.py  |  39 +++++++++++-<br>>   Modules/signalmodule.c   |   4 +-<br>>   PC/config.c              |   2 +-<br>
>   7 files changed, 138 insertions(+), 8 deletions(-)<br>><br>><br>> diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst<br>> --- a/Doc/library/signal.rst<br>> +++ b/Doc/library/signal.rst<br>> @@ -65,6 +65,16 @@<br>
>  Module contents<br>>  ---------------<br>><br>> +.. versionchanged:: 3.5<br>> +   signal (SIG*), handler (:const:`SIG_DFL`, :const:`SIG_IGN`) and sigmask<br>> +   (:const:`SIG_BLOCK`, :const:`SIG_UNBLOCK`, :const:`SIG_SETMASK`)<br>
> +   related constants listed below were turned into<br>> +   :class:`enums <enum.IntEnum>`.<br>> +   :func:`getsignal`, :func:`pthread_sigmask`, :func:`sigpending` and<br>> +   :func:`sigwait` functions return human-readable<br>
> +   :class:`enums <enum.IntEnum>`.<br>> +<br>> +<br>>  The variables defined in the :mod:`signal` module are:<br>><br>><br>> diff --git a/Doc/whatsnew/3.5.rst b/Doc/whatsnew/3.5.rst<br>> --- a/Doc/whatsnew/3.5.rst<br>
> +++ b/Doc/whatsnew/3.5.rst<br>> @@ -134,6 +134,11 @@<br>>  Improved Modules<br>>  ================<br>><br>> +* Different constants of :mod:`signal` module are now enumeration values<br>> using<br>> +  the :mod:`enum` module. This allows meaningful names to be printed<br>
> during<br>> +  debugging, instead of integer ?magic numbers?. (contribute by Giampaolo<br>> +  Rodola' in :issue:`21076`)<br>> +<br>>  * :class:`xmlrpc.client.ServerProxy` is now a :term:`context manager`<br>
>    (contributed by Claudiu Popa in :issue:`20627`).<br>><br>> diff --git a/Lib/signal.py b/Lib/signal.py<br>> new file mode 100644<br>> --- /dev/null<br>> +++ b/Lib/signal.py<br>> @@ -0,0 +1,84 @@<br>
> +import _signal<br>> +from _signal import *<br>> +from functools import wraps as _wraps<br>> +from enum import IntEnum as _IntEnum<br>> +<br>> +_globals = globals()<br>> +<br>> +Signals = _IntEnum(<br>
> +    'Signals',<br>> +    {name: value for name, value in _globals.items()<br>> +     if name.isupper()<br>> +        and (name.startswith('SIG') and not name.startswith('SIG_'))<br>> +        or name.startswith('CTRL_')})<br>
> +<br>> +class Handlers(_IntEnum):<br>> +    SIG_DFL = _signal.SIG_DFL<br>> +    SIG_IGN = _signal.SIG_IGN<br>> +<br>> +_globals.update(Signals.__members__)<br>> +_globals.update(Handlers.__members__)<br>
> +<br>> +if 'pthread_sigmask' in _globals:<br>> +    class Sigmasks(_IntEnum):<br>> +        SIG_BLOCK = _signal.SIG_BLOCK<br>> +        SIG_UNBLOCK = _signal.SIG_UNBLOCK<br>> +        SIG_SETMASK = _signal.SIG_SETMASK<br>
> +<br>> +    _globals.update(Sigmasks.__members__)<br>> +<br>> +<br>> +def _int_to_enum(value, enum_klass):<br>> +    """Convert a numeric value to an IntEnum member.<br>> +    If it's not a known member, return the numeric value itself.<br>
> +    """<br>> +    try:<br>> +        return enum_klass(value)<br>> +    except ValueError:<br>> +        return value<br>> +<br>> +<br>> +def _enum_to_int(value):<br>> +    """Convert an IntEnum member to a numeric value.<br>
> +    If it's not a IntEnum member return the value itself.<br>> +    """<br>> +    try:<br>> +        return int(value)<br>> +    except (ValueError, TypeError):<br>> +        return value<br>
> +<br>> +<br>> +@_wraps(_signal.signal)<br>> +def signal(signalnum, handler):<br>> +    handler = _signal.signal(_enum_to_int(signalnum),<br>> _enum_to_int(handler))<br>> +    return _int_to_enum(handler, Handlers)<br>
> +<br>> +<br>> +@_wraps(_signal.getsignal)<br>> +def getsignal(signalnum):<br>> +    handler = _signal.getsignal(signalnum)<br>> +    return _int_to_enum(handler, Handlers)<br>> +<br>> +<br>> +if 'pthread_sigmask' in _globals:<br>
> +    @_wraps(_signal.pthread_sigmask)<br>> +    def pthread_sigmask(how, mask):<br>> +        sigs_set = _signal.pthread_sigmask(how, mask)<br>> +        return set(_int_to_enum(x, Signals) for x in sigs_set)<br>
> +    pthread_sigmask.__doc__ = _signal.pthread_sigmask.__doc__<br>> +<br>> +<br>> +@_wraps(_signal.sigpending)<br>> +def sigpending():<br>> +    sigs = _signal.sigpending()<br>> +    return set(_int_to_enum(x, Signals) for x in sigs)<br>
> +<br>> +<br>> +if 'sigwait' in _globals:<br>> +    @_wraps(_signal.sigwait)<br>> +    def sigwait(sigset):<br>> +        retsig = _signal.sigwait(sigset)<br>> +        return _int_to_enum(retsig, Signals)<br>
> +    sigwait.__doc__ = _signal.sigwait<br>> +<br>> +del _globals, _wraps<br>> diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py<br>> --- a/Lib/test/test_doctest.py<br>> +++ b/Lib/test/test_doctest.py<br>
> @@ -2897,7 +2897,7 @@<br>><br>>  def test_main():<br>>      # Check the doctest cases in doctest itself:<br>> -    support.run_doctest(doctest, verbosity=True)<br>> +    ret = support.run_doctest(doctest, verbosity=True)<br>
>      # Check the doctest cases defined here:<br>>      from test import test_doctest<br>>      support.run_doctest(test_doctest, verbosity=True)<br>> diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py<br>
> --- a/Lib/test/test_signal.py<br>> +++ b/Lib/test/test_signal.py<br>> @@ -1,6 +1,7 @@<br>>  import unittest<br>>  from test import support<br>>  from contextlib import closing<br>> +import enum<br>>  import gc<br>
>  import pickle<br>>  import select<br>> @@ -39,6 +40,22 @@<br>>          return None<br>><br>><br>> +class GenericTests(unittest.TestCase):<br>> +<br>> +    def test_enums(self):<br>> +        for name in dir(signal):<br>
> +            sig = getattr(signal, name)<br>> +            if name in {'SIG_DFL', 'SIG_IGN'}:<br>> +                self.assertIsInstance(sig, signal.Handlers)<br>> +            elif name in {'SIG_BLOCK', 'SIG_UNBLOCK', 'SIG_SETMASK'}:<br>
> +                self.assertIsInstance(sig, signal.Sigmasks)<br>> +            elif name.startswith('SIG') and not name.startswith('SIG_'):<br>> +                self.assertIsInstance(sig, signal.Signals)<br>
> +            elif name.startswith('CTRL_'):<br>> +                self.assertIsInstance(sig, signal.Signals)<br>> +                self.assertEqual(sys.platform, "win32")<br>> +<br>> +<br>
>  @unittest.skipIf(sys.platform == "win32", "Not valid on Windows")<br>>  class InterProcessSignalTests(unittest.TestCase):<br>>      MAX_DURATION = 20   # Entire test should last at most 20 sec.<br>
> @@ -195,6 +212,7 @@<br>><br>>      def test_getsignal(self):<br>>          hup = signal.signal(signal.SIGHUP, self.trivial_signal_handler)<br>> +        self.assertIsInstance(hup, signal.Handlers)<br>>          self.assertEqual(signal.getsignal(signal.SIGHUP),<br>
>                           self.trivial_signal_handler)<br>>          signal.signal(signal.SIGHUP, hup)<br>> @@ -271,7 +289,7 @@<br>><br>>          os.close(read)<br>>          os.close(write)<br>> -        """.format(signals, ordered, test_body)<br>
> +        """.format(tuple(map(int, signals)), ordered, test_body)<br>><br>>          assert_python_ok('-c', code)<br>><br>> @@ -604,6 +622,8 @@<br>>              signal.pthread_sigmask(signal.SIG_BLOCK, [signum])<br>
>              os.kill(os.getpid(), signum)<br>>              pending = signal.sigpending()<br>> +            for sig in pending:<br>> +                assert isinstance(sig, signal.Signals), repr(pending)<br>
>              if pending != {signum}:<br>>                  raise Exception('%s != {%s}' % (pending, signum))<br>>              try:<br>> @@ -660,6 +680,7 @@<br>>          code = '''if 1:<br>
>          import signal<br>>          import sys<br>> +        from signal import Signals<br>><br>>          def handler(signum, frame):<br>>              1/0<br>> @@ -702,6 +723,7 @@<br>>          def test(signum):<br>
>              signal.alarm(1)<br>>              received = signal.sigwait([signum])<br>> +            assert isinstance(received, signal.Signals), received<br>>              if received != signum:<br>>                  raise Exception('received %s, not %s' % (received,<br>
> signum))<br>>          ''')<br>> @@ -842,8 +864,14 @@<br>>          def kill(signum):<br>>              os.kill(os.getpid(), signum)<br>><br>> +        def check_mask(mask):<br>> +            for sig in mask:<br>
> +                assert isinstance(sig, signal.Signals), repr(sig)<br>> +<br>>          def read_sigmask():<br>> -            return signal.pthread_sigmask(signal.SIG_BLOCK, [])<br>> +            sigmask = signal.pthread_sigmask(signal.SIG_BLOCK, [])<br>
> +            check_mask(sigmask)<br>> +            return sigmask<br>><br>>          signum = signal.SIGUSR1<br>><br>> @@ -852,6 +880,7 @@<br>><br>>          # Unblock SIGUSR1 (and copy the old mask) to test our signal<br>
> handler<br>>          old_mask = signal.pthread_sigmask(signal.SIG_UNBLOCK, [signum])<br>> +        check_mask(old_mask)<br>>          try:<br>>              kill(signum)<br>>          except ZeroDivisionError:<br>
> @@ -861,11 +890,13 @@<br>><br>>          # Block and then raise SIGUSR1. The signal is blocked: the signal<br>>          # handler is not called, and the signal is now pending<br>> -        signal.pthread_sigmask(signal.SIG_BLOCK, [signum])<br>
> +        mask = signal.pthread_sigmask(signal.SIG_BLOCK, [signum])<br>> +        check_mask(mask)<br>>          kill(signum)<br>><br>>          # Check the new mask<br>>          blocked = read_sigmask()<br>
> +        check_mask(blocked)<br>>          if signum not in blocked:<br>>              raise Exception("%s not in %s" % (signum, blocked))<br>>          if old_mask ^ blocked != {signum}:<br>> @@ -928,7 +959,7 @@<br>
><br>>  def test_main():<br>>      try:<br>> -        support.run_unittest(PosixTests, InterProcessSignalTests,<br>> +        support.run_unittest(GenericTests, PosixTests,<br>> InterProcessSignalTests,<br>
>                               WakeupFDTests, WakeupSignalTests,<br>>                               SiginterruptTest, ItimerTest,<br>> WindowsSignalTests,<br>>                               PendingSignalsTests)<br>
> diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c<br>> --- a/Modules/signalmodule.c<br>> +++ b/Modules/signalmodule.c<br>> @@ -967,7 +967,7 @@<br>>  };<br>><br>>  PyMODINIT_FUNC<br>> -PyInit_signal(void)<br>
> +PyInit__signal(void)<br>>  {<br>>      PyObject *m, *d, *x;<br>>      int i;<br>> @@ -1380,7 +1380,7 @@<br>>  void<br>>  PyOS_InitInterrupts(void)<br>>  {<br>> -    PyObject *m = PyImport_ImportModule("signal");<br>
> +    PyObject *m = PyImport_ImportModule("_signal");<br>>      if (m) {<br>>          Py_DECREF(m);<br>>      }<br>> diff --git a/PC/config.c b/PC/config.c<br>> --- a/PC/config.c<br>> +++ b/PC/config.c<br>
> @@ -19,7 +19,7 @@<br>>  extern PyObject* PyInit__md5(void);<br>>  extern PyObject* PyInit_nt(void);<br>>  extern PyObject* PyInit__operator(void);<br>> -extern PyObject* PyInit_signal(void);<br>> +extern PyObject* PyInit__signal(void);<br>
>  extern PyObject* PyInit__sha1(void);<br>>  extern PyObject* PyInit__sha256(void);<br>>  extern PyObject* PyInit__sha512(void);<br>><br>> --<br>> Repository URL: <a href="http://hg.python.org/cpython" target="_blank">http://hg.python.org/cpython</a><br>
><br>> _______________________________________________<br>> Python-checkins mailing list<br>> <a href="mailto:Python-checkins@python.org">Python-checkins@python.org</a><br>> <a href="https://mail.python.org/mailman/listinfo/python-checkins" target="_blank">https://mail.python.org/mailman/listinfo/python-checkins</a><br>
><br>><br>-------------- next part --------------<br>An HTML attachment was scrubbed...<br>URL: <<a href="http://mail.python.org/pipermail/python-dev/attachments/20140404/ec3c9b19/attachment-0001.html" target="_blank">http://mail.python.org/pipermail/python-dev/attachments/20140404/ec3c9b19/attachment-0001.html</a>><br>
<br>------------------------------<br><br>Message: 3<br>Date: Fri, 4 Apr 2014 10:21:39 -0400<br>From: Brett Cannon <<a href="mailto:brett@python.org">brett@python.org</a>><br>To: python-dev <<a href="mailto:python-dev@python.org">python-dev@python.org</a>><br>
Cc: python-checkins <<a href="mailto:python-checkins@python.org">python-checkins@python.org</a>><br>Subject: Re: [Python-Dev] [Python-checkins] cpython: fix #21076: turn<br>        signal module constants into enums<br>
Message-ID:<br>        <CAP1=<a href="mailto:2W4wfsa9xtOaL6VdcLpk_vGtBFd-2dd7YGrn8aSpZoChbA@mail.gmail.com">2W4wfsa9xtOaL6VdcLpk_vGtBFd-2dd7YGrn8aSpZoChbA@mail.gmail.com</a>><br>Content-Type: text/plain; charset="utf-8"<br>
<br>On Fri, Apr 4, 2014 at 10:12 AM, Brett Cannon <<a href="mailto:brett@python.org">brett@python.org</a>> wrote:<br><br>> This broke compilation on at least OS X, but I'm willing to bet for all<br>> UNIX-based systems. I have a fix in the works.<br>
><br><br>Fix is in rev c6e63bb132fb <<a href="http://hg.python.org/cpython/rev/c6e63bb132fb" target="_blank">http://hg.python.org/cpython/rev/c6e63bb132fb</a>>.<br><br><br>><br>><br>> On Fri, Apr 4, 2014 at 9:34 AM, giampaolo.rodola <<br>
> <a href="mailto:python-checkins@python.org">python-checkins@python.org</a>> wrote:<br>><br>>> <a href="http://hg.python.org/cpython/rev/c9239171e429" target="_blank">http://hg.python.org/cpython/rev/c9239171e429</a><br>
>> changeset:   90128:c9239171e429<br>>> user:        Giampaolo Rodola' <<a href="mailto:g.rodola@gmail.com">g.rodola@gmail.com</a>><br>>> date:        Fri Apr 04 15:34:17 2014 +0200<br>>> summary:<br>
>>   fix #21076: turn signal module constants into enums<br>>><br>>> files:<br>>>   Doc/library/signal.rst   |  10 +++<br>>>   Doc/whatsnew/3.5.rst     |   5 +<br>>>   Lib/signal.py            |  84 ++++++++++++++++++++++++++++<br>
>>   Lib/test/test_doctest.py |   2 +-<br>>>   Lib/test/test_signal.py  |  39 +++++++++++-<br>>>   Modules/signalmodule.c   |   4 +-<br>>>   PC/config.c              |   2 +-<br>>>   7 files changed, 138 insertions(+), 8 deletions(-)<br>
>><br>>><br>>> diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst<br>>> --- a/Doc/library/signal.rst<br>>> +++ b/Doc/library/signal.rst<br>>> @@ -65,6 +65,16 @@<br>>>  Module contents<br>
>>  ---------------<br>>><br>>> +.. versionchanged:: 3.5<br>>> +   signal (SIG*), handler (:const:`SIG_DFL`, :const:`SIG_IGN`) and<br>>> sigmask<br>>> +   (:const:`SIG_BLOCK`, :const:`SIG_UNBLOCK`, :const:`SIG_SETMASK`)<br>
>> +   related constants listed below were turned into<br>>> +   :class:`enums <enum.IntEnum>`.<br>>> +   :func:`getsignal`, :func:`pthread_sigmask`, :func:`sigpending` and<br>>> +   :func:`sigwait` functions return human-readable<br>
>> +   :class:`enums <enum.IntEnum>`.<br>>> +<br>>> +<br>>>  The variables defined in the :mod:`signal` module are:<br>>><br>>><br>>> diff --git a/Doc/whatsnew/3.5.rst b/Doc/whatsnew/3.5.rst<br>
>> --- a/Doc/whatsnew/3.5.rst<br>>> +++ b/Doc/whatsnew/3.5.rst<br>>> @@ -134,6 +134,11 @@<br>>>  Improved Modules<br>>>  ================<br>>><br>>> +* Different constants of :mod:`signal` module are now enumeration values<br>
>> using<br>>> +  the :mod:`enum` module. This allows meaningful names to be printed<br>>> during<br>>> +  debugging, instead of integer ?magic numbers?. (contribute by Giampaolo<br>>> +  Rodola' in :issue:`21076`)<br>
>> +<br>>>  * :class:`xmlrpc.client.ServerProxy` is now a :term:`context manager`<br>>>    (contributed by Claudiu Popa in :issue:`20627`).<br>>><br>>> diff --git a/Lib/signal.py b/Lib/signal.py<br>
>> new file mode 100644<br>>> --- /dev/null<br>>> +++ b/Lib/signal.py<br>>> @@ -0,0 +1,84 @@<br>>> +import _signal<br>>> +from _signal import *<br>>> +from functools import wraps as _wraps<br>
>> +from enum import IntEnum as _IntEnum<br>>> +<br>>> +_globals = globals()<br>>> +<br>>> +Signals = _IntEnum(<br>>> +    'Signals',<br>>> +    {name: value for name, value in _globals.items()<br>
>> +     if name.isupper()<br>>> +        and (name.startswith('SIG') and not name.startswith('SIG_'))<br>>> +        or name.startswith('CTRL_')})<br>>> +<br>>> +class Handlers(_IntEnum):<br>
>> +    SIG_DFL = _signal.SIG_DFL<br>>> +    SIG_IGN = _signal.SIG_IGN<br>>> +<br>>> +_globals.update(Signals.__members__)<br>>> +_globals.update(Handlers.__members__)<br>>> +<br>>> +if 'pthread_sigmask' in _globals:<br>
>> +    class Sigmasks(_IntEnum):<br>>> +        SIG_BLOCK = _signal.SIG_BLOCK<br>>> +        SIG_UNBLOCK = _signal.SIG_UNBLOCK<br>>> +        SIG_SETMASK = _signal.SIG_SETMASK<br>>> +<br>>> +    _globals.update(Sigmasks.__members__)<br>
>> +<br>>> +<br>>> +def _int_to_enum(value, enum_klass):<br>>> +    """Convert a numeric value to an IntEnum member.<br>>> +    If it's not a known member, return the numeric value itself.<br>
>> +    """<br>>> +    try:<br>>> +        return enum_klass(value)<br>>> +    except ValueError:<br>>> +        return value<br>>> +<br>>> +<br>>> +def _enum_to_int(value):<br>
>> +    """Convert an IntEnum member to a numeric value.<br>>> +    If it's not a IntEnum member return the value itself.<br>>> +    """<br>>> +    try:<br>>> +        return int(value)<br>
>> +    except (ValueError, TypeError):<br>>> +        return value<br>>> +<br>>> +<br>>> +@_wraps(_signal.signal)<br>>> +def signal(signalnum, handler):<br>>> +    handler = _signal.signal(_enum_to_int(signalnum),<br>
>> _enum_to_int(handler))<br>>> +    return _int_to_enum(handler, Handlers)<br>>> +<br>>> +<br>>> +@_wraps(_signal.getsignal)<br>>> +def getsignal(signalnum):<br>>> +    handler = _signal.getsignal(signalnum)<br>
>> +    return _int_to_enum(handler, Handlers)<br>>> +<br>>> +<br>>> +if 'pthread_sigmask' in _globals:<br>>> +    @_wraps(_signal.pthread_sigmask)<br>>> +    def pthread_sigmask(how, mask):<br>
>> +        sigs_set = _signal.pthread_sigmask(how, mask)<br>>> +        return set(_int_to_enum(x, Signals) for x in sigs_set)<br>>> +    pthread_sigmask.__doc__ = _signal.pthread_sigmask.__doc__<br>>> +<br>
>> +<br>>> +@_wraps(_signal.sigpending)<br>>> +def sigpending():<br>>> +    sigs = _signal.sigpending()<br>>> +    return set(_int_to_enum(x, Signals) for x in sigs)<br>>> +<br>>> +<br>
>> +if 'sigwait' in _globals:<br>>> +    @_wraps(_signal.sigwait)<br>>> +    def sigwait(sigset):<br>>> +        retsig = _signal.sigwait(sigset)<br>>> +        return _int_to_enum(retsig, Signals)<br>
>> +    sigwait.__doc__ = _signal.sigwait<br>>> +<br>>> +del _globals, _wraps<br>>> diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py<br>>> --- a/Lib/test/test_doctest.py<br>>> +++ b/Lib/test/test_doctest.py<br>
>> @@ -2897,7 +2897,7 @@<br>>><br>>>  def test_main():<br>>>      # Check the doctest cases in doctest itself:<br>>> -    support.run_doctest(doctest, verbosity=True)<br>>> +    ret = support.run_doctest(doctest, verbosity=True)<br>
>>      # Check the doctest cases defined here:<br>>>      from test import test_doctest<br>>>      support.run_doctest(test_doctest, verbosity=True)<br>>> diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py<br>
>> --- a/Lib/test/test_signal.py<br>>> +++ b/Lib/test/test_signal.py<br>>> @@ -1,6 +1,7 @@<br>>>  import unittest<br>>>  from test import support<br>>>  from contextlib import closing<br>
>> +import enum<br>>>  import gc<br>>>  import pickle<br>>>  import select<br>>> @@ -39,6 +40,22 @@<br>>>          return None<br>>><br>>><br>>> +class GenericTests(unittest.TestCase):<br>
>> +<br>>> +    def test_enums(self):<br>>> +        for name in dir(signal):<br>>> +            sig = getattr(signal, name)<br>>> +            if name in {'SIG_DFL', 'SIG_IGN'}:<br>
>> +                self.assertIsInstance(sig, signal.Handlers)<br>>> +            elif name in {'SIG_BLOCK', 'SIG_UNBLOCK', 'SIG_SETMASK'}:<br>>> +                self.assertIsInstance(sig, signal.Sigmasks)<br>
>> +            elif name.startswith('SIG') and not name.startswith('SIG_'):<br>>> +                self.assertIsInstance(sig, signal.Signals)<br>>> +            elif name.startswith('CTRL_'):<br>
>> +                self.assertIsInstance(sig, signal.Signals)<br>>> +                self.assertEqual(sys.platform, "win32")<br>>> +<br>>> +<br>>>  @unittest.skipIf(sys.platform == "win32", "Not valid on Windows")<br>
>>  class InterProcessSignalTests(unittest.TestCase):<br>>>      MAX_DURATION = 20   # Entire test should last at most 20 sec.<br>>> @@ -195,6 +212,7 @@<br>>><br>>>      def test_getsignal(self):<br>
>>          hup = signal.signal(signal.SIGHUP, self.trivial_signal_handler)<br>>> +        self.assertIsInstance(hup, signal.Handlers)<br>>>          self.assertEqual(signal.getsignal(signal.SIGHUP),<br>
>>                           self.trivial_signal_handler)<br>>>          signal.signal(signal.SIGHUP, hup)<br>>> @@ -271,7 +289,7 @@<br>>><br>>>          os.close(read)<br>>>          os.close(write)<br>
>> -        """.format(signals, ordered, test_body)<br>>> +        """.format(tuple(map(int, signals)), ordered, test_body)<br>>><br>>>          assert_python_ok('-c', code)<br>
>><br>>> @@ -604,6 +622,8 @@<br>>>              signal.pthread_sigmask(signal.SIG_BLOCK, [signum])<br>>>              os.kill(os.getpid(), signum)<br>>>              pending = signal.sigpending()<br>
>> +            for sig in pending:<br>>> +                assert isinstance(sig, signal.Signals), repr(pending)<br>>>              if pending != {signum}:<br>>>                  raise Exception('%s != {%s}' % (pending, signum))<br>
>>              try:<br>>> @@ -660,6 +680,7 @@<br>>>          code = '''if 1:<br>>>          import signal<br>>>          import sys<br>>> +        from signal import Signals<br>
>><br>>>          def handler(signum, frame):<br>>>              1/0<br>>> @@ -702,6 +723,7 @@<br>>>          def test(signum):<br>>>              signal.alarm(1)<br>>>              received = signal.sigwait([signum])<br>
>> +            assert isinstance(received, signal.Signals), received<br>>>              if received != signum:<br>>>                  raise Exception('received %s, not %s' % (received,<br>>> signum))<br>
>>          ''')<br>>> @@ -842,8 +864,14 @@<br>>>          def kill(signum):<br>>>              os.kill(os.getpid(), signum)<br>>><br>>> +        def check_mask(mask):<br>>> +            for sig in mask:<br>
>> +                assert isinstance(sig, signal.Signals), repr(sig)<br>>> +<br>>>          def read_sigmask():<br>>> -            return signal.pthread_sigmask(signal.SIG_BLOCK, [])<br>>> +            sigmask = signal.pthread_sigmask(signal.SIG_BLOCK, [])<br>
>> +            check_mask(sigmask)<br>>> +            return sigmask<br>>><br>>>          signum = signal.SIGUSR1<br>>><br>>> @@ -852,6 +880,7 @@<br>>><br>>>          # Unblock SIGUSR1 (and copy the old mask) to test our signal<br>
>> handler<br>>>          old_mask = signal.pthread_sigmask(signal.SIG_UNBLOCK, [signum])<br>>> +        check_mask(old_mask)<br>>>          try:<br>>>              kill(signum)<br>>>          except ZeroDivisionError:<br>
>> @@ -861,11 +890,13 @@<br>>><br>>>          # Block and then raise SIGUSR1. The signal is blocked: the signal<br>>>          # handler is not called, and the signal is now pending<br>>> -        signal.pthread_sigmask(signal.SIG_BLOCK, [signum])<br>
>> +        mask = signal.pthread_sigmask(signal.SIG_BLOCK, [signum])<br>>> +        check_mask(mask)<br>>>          kill(signum)<br>>><br>>>          # Check the new mask<br>>>          blocked = read_sigmask()<br>
>> +        check_mask(blocked)<br>>>          if signum not in blocked:<br>>>              raise Exception("%s not in %s" % (signum, blocked))<br>>>          if old_mask ^ blocked != {signum}:<br>
>> @@ -928,7 +959,7 @@<br>>><br>>>  def test_main():<br>>>      try:<br>>> -        support.run_unittest(PosixTests, InterProcessSignalTests,<br>>> +        support.run_unittest(GenericTests, PosixTests,<br>
>> InterProcessSignalTests,<br>>>                               WakeupFDTests, WakeupSignalTests,<br>>>                               SiginterruptTest, ItimerTest,<br>>> WindowsSignalTests,<br>>>                               PendingSignalsTests)<br>
>> diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c<br>>> --- a/Modules/signalmodule.c<br>>> +++ b/Modules/signalmodule.c<br>>> @@ -967,7 +967,7 @@<br>>>  };<br>>><br>>>  PyMODINIT_FUNC<br>
>> -PyInit_signal(void)<br>>> +PyInit__signal(void)<br>>>  {<br>>>      PyObject *m, *d, *x;<br>>>      int i;<br>>> @@ -1380,7 +1380,7 @@<br>>>  void<br>>>  PyOS_InitInterrupts(void)<br>
>>  {<br>>> -    PyObject *m = PyImport_ImportModule("signal");<br>>> +    PyObject *m = PyImport_ImportModule("_signal");<br>>>      if (m) {<br>>>          Py_DECREF(m);<br>
>>      }<br>>> diff --git a/PC/config.c b/PC/config.c<br>>> --- a/PC/config.c<br>>> +++ b/PC/config.c<br>>> @@ -19,7 +19,7 @@<br>>>  extern PyObject* PyInit__md5(void);<br>>>  extern PyObject* PyInit_nt(void);<br>
>>  extern PyObject* PyInit__operator(void);<br>>> -extern PyObject* PyInit_signal(void);<br>>> +extern PyObject* PyInit__signal(void);<br>>>  extern PyObject* PyInit__sha1(void);<br>>>  extern PyObject* PyInit__sha256(void);<br>
>>  extern PyObject* PyInit__sha512(void);<br>>><br>>> --<br>>> Repository URL: <a href="http://hg.python.org/cpython" target="_blank">http://hg.python.org/cpython</a><br>>><br>>> _______________________________________________<br>
>> Python-checkins mailing list<br>>> <a href="mailto:Python-checkins@python.org">Python-checkins@python.org</a><br>>> <a href="https://mail.python.org/mailman/listinfo/python-checkins" target="_blank">https://mail.python.org/mailman/listinfo/python-checkins</a><br>
>><br>>><br>><br>-------------- next part --------------<br>An HTML attachment was scrubbed...<br>URL: <<a href="http://mail.python.org/pipermail/python-dev/attachments/20140404/ff31ca9e/attachment.html" target="_blank">http://mail.python.org/pipermail/python-dev/attachments/20140404/ff31ca9e/attachment.html</a>><br>
<br>------------------------------<br><br>Subject: Digest Footer<br><br>_______________________________________________<br>Python-Dev mailing list<br><a href="mailto:Python-Dev@python.org">Python-Dev@python.org</a><br><a href="https://mail.python.org/mailman/listinfo/python-dev" target="_blank">https://mail.python.org/mailman/listinfo/python-dev</a><br>
<br><br>------------------------------<br><br>End of Python-Dev Digest, Vol 129, Issue 6<br>******************************************<br></blockquote></div><br>