summaryrefslogtreecommitdiffstats
path: root/Lib/asyncio/events.py
diff options
context:
space:
mode:
authorAndrew Svetlov <andrew.svetlov@gmail.com>2017-12-15 05:04:38 (GMT)
committerGitHub <noreply@github.com>2017-12-15 05:04:38 (GMT)
commitf74ef458ab1f502e4e60bd1502ac1dc0d2cb3847 (patch)
tree7c622fa99ba081586a655b1744dae0a46b3a0f95 /Lib/asyncio/events.py
parent19a44f63c738388ef3c8515348b4ffc061dfd627 (diff)
downloadcpython-f74ef458ab1f502e4e60bd1502ac1dc0d2cb3847.zip
cpython-f74ef458ab1f502e4e60bd1502ac1dc0d2cb3847.tar.gz
cpython-f74ef458ab1f502e4e60bd1502ac1dc0d2cb3847.tar.bz2
bpo-32311: Implement asyncio.create_task() shortcut (#4848)
* Implement functionality * Add documentation
Diffstat (limited to 'Lib/asyncio/events.py')
-rw-r--r--Lib/asyncio/events.py83
1 files changed, 7 insertions, 76 deletions
diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py
index a00f861..974a4a2 100644
--- a/Lib/asyncio/events.py
+++ b/Lib/asyncio/events.py
@@ -11,86 +11,14 @@ __all__ = (
'_get_running_loop',
)
-import functools
-import inspect
import os
-import reprlib
import socket
import subprocess
import sys
import threading
-import traceback
from . import constants
-
-
-def _get_function_source(func):
- func = inspect.unwrap(func)
- if inspect.isfunction(func):
- code = func.__code__
- return (code.co_filename, code.co_firstlineno)
- if isinstance(func, functools.partial):
- return _get_function_source(func.func)
- if isinstance(func, functools.partialmethod):
- return _get_function_source(func.func)
- return None
-
-
-def _format_args_and_kwargs(args, kwargs):
- """Format function arguments and keyword arguments.
-
- Special case for a single parameter: ('hello',) is formatted as ('hello').
- """
- # use reprlib to limit the length of the output
- items = []
- if args:
- items.extend(reprlib.repr(arg) for arg in args)
- if kwargs:
- items.extend(f'{k}={reprlib.repr(v)}' for k, v in kwargs.items())
- return '({})'.format(', '.join(items))
-
-
-def _format_callback(func, args, kwargs, suffix=''):
- if isinstance(func, functools.partial):
- suffix = _format_args_and_kwargs(args, kwargs) + suffix
- return _format_callback(func.func, func.args, func.keywords, suffix)
-
- if hasattr(func, '__qualname__'):
- func_repr = getattr(func, '__qualname__')
- elif hasattr(func, '__name__'):
- func_repr = getattr(func, '__name__')
- else:
- func_repr = repr(func)
-
- func_repr += _format_args_and_kwargs(args, kwargs)
- if suffix:
- func_repr += suffix
- return func_repr
-
-
-def _format_callback_source(func, args):
- func_repr = _format_callback(func, args, None)
- source = _get_function_source(func)
- if source:
- func_repr += f' at {source[0]}:{source[1]}'
- return func_repr
-
-
-def extract_stack(f=None, limit=None):
- """Replacement for traceback.extract_stack() that only does the
- necessary work for asyncio debug mode.
- """
- if f is None:
- f = sys._getframe().f_back
- if limit is None:
- # Limit the amount of work to a reasonable amount, as extract_stack()
- # can be called for each coroutine and future in debug mode.
- limit = constants.DEBUG_STACK_DEPTH
- stack = traceback.StackSummary.extract(traceback.walk_stack(f),
- limit=limit,
- lookup_lines=False)
- stack.reverse()
- return stack
+from . import format_helpers
class Handle:
@@ -106,7 +34,8 @@ class Handle:
self._cancelled = False
self._repr = None
if self._loop.get_debug():
- self._source_traceback = extract_stack(sys._getframe(1))
+ self._source_traceback = format_helpers.extract_stack(
+ sys._getframe(1))
else:
self._source_traceback = None
@@ -115,7 +44,8 @@ class Handle:
if self._cancelled:
info.append('cancelled')
if self._callback is not None:
- info.append(_format_callback_source(self._callback, self._args))
+ info.append(format_helpers._format_callback_source(
+ self._callback, self._args))
if self._source_traceback:
frame = self._source_traceback[-1]
info.append(f'created at {frame[0]}:{frame[1]}')
@@ -145,7 +75,8 @@ class Handle:
try:
self._callback(*self._args)
except Exception as exc:
- cb = _format_callback_source(self._callback, self._args)
+ cb = format_helpers._format_callback_source(
+ self._callback, self._args)
msg = f'Exception in callback {cb}'
context = {
'message': msg,