@@ -110,6 +110,16 @@ def __del__(self):
110110 self .loop .call_exception_handler ({'message' : msg })
111111
112112
113+ def isfuture (obj ):
114+ """Check for a Future.
115+
116+ This returns True when obj is a Future instance or is advertising
117+ itself as duck-type compatible by setting _asyncio_future_blocking.
118+ See comment in Future for more details.
119+ """
120+ return getattr (obj , '_asyncio_future_blocking' , None ) is not None
121+
122+
113123class Future :
114124 """This class is *almost* compatible with concurrent.futures.Future.
115125
@@ -423,15 +433,17 @@ def _chain_future(source, destination):
423433 If destination is cancelled, source gets cancelled too.
424434 Compatible with both asyncio.Future and concurrent.futures.Future.
425435 """
426- if not isinstance (source , (Future , concurrent .futures .Future )):
436+ if not isfuture (source ) and not isinstance (source ,
437+ concurrent .futures .Future ):
427438 raise TypeError ('A future is required for source argument' )
428- if not isinstance (destination , (Future , concurrent .futures .Future )):
439+ if not isfuture (destination ) and not isinstance (destination ,
440+ concurrent .futures .Future ):
429441 raise TypeError ('A future is required for destination argument' )
430- source_loop = source ._loop if isinstance (source , Future ) else None
431- dest_loop = destination ._loop if isinstance (destination , Future ) else None
442+ source_loop = source ._loop if isfuture (source ) else None
443+ dest_loop = destination ._loop if isfuture (destination ) else None
432444
433445 def _set_state (future , other ):
434- if isinstance (future , Future ):
446+ if isfuture (future ):
435447 _copy_future_state (other , future )
436448 else :
437449 _set_concurrent_future_state (future , other )
@@ -455,7 +467,7 @@ def _call_set_state(source):
455467
456468def wrap_future (future , * , loop = None ):
457469 """Wrap concurrent.futures.Future object."""
458- if isinstance (future , Future ):
470+ if isfuture (future ):
459471 return future
460472 assert isinstance (future , concurrent .futures .Future ), \
461473 'concurrent.futures.Future is expected, got {!r}' .format (future )
0 commit comments