Skip to content
This repository was archived by the owner on Nov 23, 2017. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion asyncio/coroutines.py
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ def _format_coroutine(coro):
func = coro

if coro_name is None:
coro_name = events._format_callback(func, ())
coro_name = events._format_callback(func, (), {})

try:
coro_code = coro.gi_code
Expand Down
27 changes: 14 additions & 13 deletions asyncio/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,23 +35,25 @@ def _get_function_source(func):
return None


def _format_args(args):
"""Format function arguments.
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
args_repr = reprlib.repr(args)
if len(args) == 1 and args_repr.endswith(',)'):
args_repr = args_repr[:-2] + ')'
return args_repr
items = []
if args:
items.extend(reprlib.repr(arg) for arg in args)
if kwargs:
items.extend('{}={}'.format(k, reprlib.repr(v))
for k, v in kwargs.items())
return '(' + ', '.join(items) + ')'


def _format_callback(func, args, suffix=''):
def _format_callback(func, args, kwargs, suffix=''):
if isinstance(func, functools.partial):
if args is not None:
suffix = _format_args(args) + suffix
return _format_callback(func.func, func.args, suffix)
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__')
Expand All @@ -60,14 +62,13 @@ def _format_callback(func, args, suffix=''):
else:
func_repr = repr(func)

if args is not None:
func_repr += _format_args(args)
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)
func_repr = _format_callback(func, args, None)
source = _get_function_source(func)
if source:
func_repr += ' at %s:%s' % source
Expand Down
9 changes: 8 additions & 1 deletion tests/test_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -2070,7 +2070,7 @@ def create_event_loop(self):
return asyncio.SelectorEventLoop(selectors.SelectSelector())


def noop(*args):
def noop(*args, **kwargs):
pass


Expand Down Expand Up @@ -2151,6 +2151,13 @@ def test_handle_repr(self):
% (re.escape(filename), lineno))
self.assertRegex(repr(h), regex)

# partial function with keyword args
cb = functools.partial(noop, x=1)
h = asyncio.Handle(cb, (2, 3), self.loop)
regex = (r'^<Handle noop\(x=1\)\(2, 3\) at %s:%s>$'
% (re.escape(filename), lineno))
self.assertRegex(repr(h), regex)

# partial method
if sys.version_info >= (3, 4):
method = HandleTests.test_handle_repr
Expand Down