diff --git a/homeassistant/core.py b/homeassistant/core.py index 75f3fe7dae6..f140cd1a0dd 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -259,9 +259,10 @@ class HomeAssistant: """ task = None + # Check for partials to properly determine if coroutine function check_target = target - if isinstance(target, functools.partial): - check_target = target.func + while isinstance(check_target, functools.partial): + check_target = check_target.func if asyncio.iscoroutine(check_target): task = self.loop.create_task(target) # type: ignore diff --git a/homeassistant/util/logging.py b/homeassistant/util/logging.py index ae32566c73c..214d9417e2a 100644 --- a/homeassistant/util/logging.py +++ b/homeassistant/util/logging.py @@ -1,7 +1,7 @@ """Logging utilities.""" import asyncio from asyncio.events import AbstractEventLoop -from functools import wraps +from functools import partial, wraps import inspect import logging import threading @@ -139,8 +139,13 @@ def catch_log_exception( friendly_msg = format_err(*args) logging.getLogger(module_name).error('%s\n%s', friendly_msg, exc_msg) + # Check for partials to properly determine if coroutine function + check_func = func + while isinstance(check_func, partial): + check_func = check_func.func + wrapper_func = None - if asyncio.iscoroutinefunction(func): + if asyncio.iscoroutinefunction(check_func): @wraps(func) async def async_wrapper(*args: Any) -> None: """Catch and log exception."""