--- /dev/null
- return getattr(obj, '_asyncio_future_blocking', None) is not None
+__all__ = []
+
+import concurrent.futures._base
+import reprlib
+
+from . import events
+
+Error = concurrent.futures._base.Error
+CancelledError = concurrent.futures.CancelledError
+TimeoutError = concurrent.futures.TimeoutError
+
+
+class InvalidStateError(Error):
+ """The operation is not allowed in this state."""
+
+
+# States for Future.
+_PENDING = 'PENDING'
+_CANCELLED = 'CANCELLED'
+_FINISHED = 'FINISHED'
+
+
+def isfuture(obj):
+ """Check for a Future.
+
+ This returns True when obj is a Future instance or is advertising
+ itself as duck-type compatible by setting _asyncio_future_blocking.
+ See comment in Future for more details.
+ """
++ return (hasattr(obj.__class__, '_asyncio_future_blocking') and
++ obj._asyncio_future_blocking is not None)
+
+
+def _format_callbacks(cb):
+ """helper function for Future.__repr__"""
+ size = len(cb)
+ if not size:
+ cb = ''
+
+ def format_cb(callback):
+ return events._format_callback_source(callback, ())
+
+ if size == 1:
+ cb = format_cb(cb[0])
+ elif size == 2:
+ cb = '{}, {}'.format(format_cb(cb[0]), format_cb(cb[1]))
+ elif size > 2:
+ cb = '{}, <{} more>, {}'.format(format_cb(cb[0]),
+ size - 2,
+ format_cb(cb[-1]))
+ return 'cb=[%s]' % cb
+
+
+def _future_repr_info(future):
+ # (Future) -> str
+ """helper function for Future.__repr__"""
+ info = [future._state.lower()]
+ if future._state == _FINISHED:
+ if future._exception is not None:
+ info.append('exception={!r}'.format(future._exception))
+ else:
+ # use reprlib to limit the length of the output, especially
+ # for very long strings
+ result = reprlib.repr(future._result)
+ info.append('result={}'.format(result))
+ if future._callbacks:
+ info.append(_format_callbacks(future._callbacks))
+ if future._source_traceback:
+ frame = future._source_traceback[-1]
+ info.append('created at %s:%s' % (frame[0], frame[1]))
+ return info
self.loop = self.new_test_loop()
self.addCleanup(self.loop.close)
-
+ def test_isfuture(self):
+ class MyFuture:
+ _asyncio_future_blocking = None
+
+ def __init__(self):
+ self._asyncio_future_blocking = False
+
+ self.assertFalse(asyncio.isfuture(MyFuture))
+ self.assertTrue(asyncio.isfuture(MyFuture()))
- self.assertFalse(asyncio.isfuture(asyncio.Future))
+ self.assertFalse(asyncio.isfuture(1))
- self.assertTrue(asyncio.isfuture(mock.Mock(asyncio.Future)))
+
+ # As `isinstance(Mock(), Future)` returns `False`
+ self.assertFalse(asyncio.isfuture(mock.Mock()))
+
++ f = self._new_future(loop=self.loop)
++ self.assertTrue(asyncio.isfuture(f))
++ self.assertFalse(asyncio.isfuture(type(f)))
++
+ # As `isinstance(Mock(Future), Future)` returns `True`
- f = asyncio.Future(loop=self.loop)
- self.assertTrue(asyncio.isfuture(f))
++ self.assertTrue(asyncio.isfuture(mock.Mock(type(f))))
+
+ f.cancel()
+
def test_initial_state(self):
- f = asyncio.Future(loop=self.loop)
+ f = self._new_future(loop=self.loop)
self.assertFalse(f.cancelled())
self.assertFalse(f.done())
f.cancel()
Core and Builtins
-----------------
-- Issue #28426: Fixed potential crash in PyUnicode_AsDecodedObject() in debug
- build.
-
-- Issue #23782: Fixed possible memory leak in _PyTraceback_Add() and exception
- loss in PyTraceBack_Here().
-
-- Issue #28379: Added sanity checks and tests for PyUnicode_CopyCharacters().
+- Issue #28583: PyDict_SetDefault didn't combine split table when needed.
Patch by Xiang Zhang.
-- Issue #28376: The type of long range iterator is now registered as Iterator.
- Patch by Oren Milman.
-
-- Issue #28376: The constructor of range_iterator now checks that step is not 0.
- Patch by Oren Milman.
-
-- Issue #26906: Resolving special methods of uninitialized type now causes
- implicit initialization of the type instead of a fail.
-
-- Issue #18287: PyType_Ready() now checks that tp_name is not NULL.
- Original patch by Niklas Koep.
-
-- Issue #24098: Fixed possible crash when AST is changed in process of
- compiling it.
-
-- Issue #28350: String constants with null character no longer interned.
-
-- Issue #26617: Fix crash when GC runs during weakref callbacks.
-
-- Issue #27942: String constants now interned recursively in tuples and frozensets.
-
-- Issue #21578: Fixed misleading error message when ImportError called with
- invalid keyword args.
-
-- Issue #28203: Fix incorrect type in error message from
- ``complex(1.0, {2:3})``. Patch by Soumya Sharma.
-
-- Issue #27955: Fallback on reading /dev/urandom device when the getrandom()
- syscall fails with EPERM, for example when blocked by SECCOMP.
-
-- Issue #28131: Fix a regression in zipimport's compile_source(). zipimport
- should use the same optimization level as the interpreter.
-
-- Issue #25221: Fix corrupted result from PyLong_FromLong(0) when
- Python is compiled with NSMALLPOSINTS = 0.
+Library
+-------
-- Issue #25758: Prevents zipimport from unnecessarily encoding a filename
- (patch by Eryk Sun)
+- Issue #28387: Fixed possible crash in _io.TextIOWrapper deallocator when
+ the garbage collector is invoked in other thread. Based on patch by
+ Sebastian Cufre.
-- Issue #28189: dictitems_contains no longer swallows compare errors.
- (Patch by Xiang Zhang)
+- Issue #28600: Optimize loop.call_soon.
-- Issue #27812: Properly clear out a generator's frame's backreference to the
- generator to prevent crashes in frame.clear().
+- Issue #28613: Fix get_event_loop() return the current loop if
+ called from coroutines/callbacks.
-- Issue #27811: Fix a crash when a coroutine that has not been awaited is
- finalized with warnings-as-errors enabled.
++- Issue #28634: Fix asyncio.isfuture() to support unittest.Mock.
+
-- Issue #27587: Fix another issue found by PVS-Studio: Null pointer check
- after use of 'def' in _PyState_AddModule().
- Initial patch by Christian Heimes.
+Documentation
+-------------
-- Issue #26020: set literal evaluation order did not match documented behaviour.
+- Issue #28513: Documented command-line interface of zipfile.
-- Issue #27782: Multi-phase extension module import now correctly allows the
- ``m_methods`` field to be used to add module level functions to instances
- of non-module types returned from ``Py_create_mod``. Patch by Xiang Zhang.
-- Issue #27936: The round() function accepted a second None argument
- for some types but not for others. Fixed the inconsistency by
- accepting None for all numeric types.
+What's New in Python 3.6.0 beta 3
+=================================
-- Issue #27487: Warn if a submodule argument to "python -m" or
- runpy.run_module() is found in sys.modules after parent packages are
- imported, but before the submodule is executed.
+*Release date: 2016-10-31*
-- Issue #27558: Fix a SystemError in the implementation of "raise" statement.
- In a brand new thread, raise a RuntimeError since there is no active
- exception to reraise. Patch written by Xiang Zhang.
+Core and Builtins
+-----------------
-- Issue #27419: Standard __import__() no longer look up "__import__" in globals
- or builtins for importing submodules or "from import". Fixed handling an
- error of non-string package name.
+- Issue #28128: Deprecation warning for invalid str and byte escape
+ sequences now prints better information about where the error
+ occurs. Patch by Serhiy Storchaka and Eric Smith.
-- Issue #27083: Respect the PYTHONCASEOK environment variable under Windows.
+- Issue #28509: dict.update() no longer allocate unnecessary large memory.
-- Issue #27514: Make having too many statically nested blocks a SyntaxError
- instead of SystemError.
+- Issue #28426: Fixed potential crash in PyUnicode_AsDecodedObject() in debug
+ build.
-- Issue #27473: Fixed possible integer overflow in bytes and bytearray
- concatenations. Patch by Xiang Zhang.
+- Issue #28517: Fixed of-by-one error in the peephole optimizer that caused
+ keeping unreachable code.
-- Issue #27507: Add integer overflow check in bytearray.extend(). Patch by
- Xiang Zhang.
+- Issue #28214: Improved exception reporting for problematic __set_name__
+ attributes.
-- Issue #27581: Don't rely on wrapping for overflow check in
- PySequence_Tuple(). Patch by Xiang Zhang.
+- Issue #23782: Fixed possible memory leak in _PyTraceback_Add() and exception
+ loss in PyTraceBack_Here().
-- Issue #27443: __length_hint__() of bytearray iterators no longer return a
- negative integer for a resized bytearray.
+- Issue #28471: Fix "Python memory allocator called without holding the GIL"
+ crash in socket.setblocking.
Library
-------