[Python-Dev] Python-Dev Digest, Vol 129, Issue 6

Kells Pablo nombizile at gmail.com
Mon Apr 7 09:15:48 CEST 2014


HELLO...

!thank you for all the cooperation and emails send. i would like that you
now stop sending them..

thank you in advance

On Fri, Apr 4, 2014 at 4:22 PM, <python-dev-request at python.org> wrote:

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


More information about the Python-Dev mailing list