From 6e78fb3d312157a67513d1d4cef16b184f221341 Mon Sep 17 00:00:00 2001 From: Alexey Stepanov Date: Tue, 11 Sep 2018 16:30:12 +0200 Subject: [PATCH 1/2] Update type annotations * clean up legacy pylint rules * fix docs misprints * gates on mainstream python Signed-off-by: Alexey Stepanov --- .travis.yml | 5 ++--- doc/source/gthreadpooled.rst | 2 +- doc/source/threaded.rst | 4 ++-- threaded/_asynciotask.py | 27 +++++++++++---------------- threaded/_class_decorator.py | 17 +++++++++++------ threaded/_gthreadpooled.py | 27 +++++++++++++-------------- threaded/_threaded.py | 24 +++++++++++++++--------- threaded/_threadpooled.py | 30 +++++++++++++----------------- 8 files changed, 68 insertions(+), 68 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3e44833..f9b5096 100644 --- a/.travis.yml +++ b/.travis.yml @@ -46,12 +46,12 @@ _helpers: - &static_analysis stage: Static analysis - <<: *python36 + <<: *python37 after_success: skip - &code_style_check stage: Code style check - <<: *python36 + <<: *python37 after_success: skip script: @@ -91,7 +91,6 @@ jobs: script: - bandit -r threaded - <<: *static_analysis - <<: *python37 name: "MyPy" install: - *upgrade_python_toolset diff --git a/doc/source/gthreadpooled.rst b/doc/source/gthreadpooled.rst index 154f263..aa94e2c 100644 --- a/doc/source/gthreadpooled.rst +++ b/doc/source/gthreadpooled.rst @@ -53,5 +53,5 @@ API: Decorators: `GThreadPooled`, `gthreadpooled`. Post function to gevent.threadpool.ThreadPool. :param func: function to wrap - :type func: typing.Optional[typing.Callable] + :type func: typing.Optional[typing.Callable[..., typing.Union[typing.Any, typing.Awaitable]]] :rtype: typing.Union[GThreadPooled, typing.Callable[..., gevent.event.AsyncResult]] diff --git a/doc/source/threaded.rst b/doc/source/threaded.rst index 02f5b1c..cfb2b7a 100644 --- a/doc/source/threaded.rst +++ b/doc/source/threaded.rst @@ -15,7 +15,7 @@ API: Decorators: `Threaded` class and `threaded` function. :param name: New thread name. If callable: use as wrapped function. If none: use wrapped function name. - :type name: typing.Optional[typing.Union[str, typing.Callable[.., typing.Union[typing.Any, typing.Awaitable]]]] + :type name: typing.Optional[typing.Union[str, typing.Callable[..., typing.Union[typing.Any, typing.Awaitable]]]] :param daemon: Daemonize thread. :type daemon: bool :param started: Return started thread @@ -53,7 +53,7 @@ API: Decorators: `Threaded` class and `threaded` function. :param name: New thread name. If callable: use as wrapped function. If none: use wrapped function name. - :type name: typing.Optional[typing.Union[str, typing.Callable]] + :type name: typing.Optional[typing.Union[str, typing.Callable[..., typing.Union[typing.Any, typing.Awaitable]]]] :param daemon: Daemonize thread. :type daemon: bool :param started: Return started thread diff --git a/threaded/_asynciotask.py b/threaded/_asynciotask.py index 91ada60..8c83dfc 100644 --- a/threaded/_asynciotask.py +++ b/threaded/_asynciotask.py @@ -36,7 +36,7 @@ class AsyncIOTask(_class_decorator.BaseDecorator): def __init__( self, - func: typing.Optional[typing.Callable] = None, + func: typing.Optional[typing.Callable[..., typing.Awaitable]] = None, *, loop_getter: typing.Union[ typing.Callable[..., asyncio.AbstractEventLoop], @@ -47,7 +47,7 @@ def __init__( """Wrap function in future and return. :param func: Function to wrap - :type func: typing.Optional[typing.Callable] + :type func: typing.Optional[typing.Callable[..., typing.Awaitable]] :param loop_getter: Method to get event loop, if wrap in asyncio task :type loop_getter: typing.Union[ typing.Callable[..., asyncio.AbstractEventLoop], @@ -69,10 +69,7 @@ def loop_getter( ]: """Loop getter. - :rtype: typing.Union[ - typing.Callable[..., asyncio.AbstractEventLoop], - asyncio.AbstractEventLoop - ] + :rtype: typing.Union[typing.Callable[..., asyncio.AbstractEventLoop], asyncio.AbstractEventLoop] """ return self.__loop_getter @@ -98,18 +95,17 @@ def get_loop( def _get_function_wrapper( self, - func: typing.Callable + func: typing.Callable[..., typing.Awaitable] ) -> typing.Callable[..., asyncio.Task]: """Here should be constructed and returned real decorator. :param func: Wrapped function - :type func: typing.Callable + :type func: typing.Callable[..., typing.Awaitable] :return: wrapper, which will produce asyncio.Task on call with function called inside it :rtype: typing.Callable[..., asyncio.Task] """ - # pylint: disable=missing-docstring # noinspection PyMissingOrEmptyDocstring - @functools.wraps(func) + @functools.wraps(func) # pylint: disable=missing-docstring def wrapper( *args, # type: typing.Any **kwargs # type: typing.Any @@ -117,12 +113,11 @@ def wrapper( loop = self.get_loop(*args, **kwargs) return loop.create_task(func(*args, **kwargs)) - # pylint: enable=missing-docstring return wrapper def __call__( # pylint: disable=useless-super-delegation self, - *args: typing.Union[typing.Callable, typing.Any], + *args: typing.Union[typing.Callable[..., typing.Awaitable], typing.Any], **kwargs: typing.Any ) -> typing.Union[asyncio.Task, typing.Callable[..., asyncio.Task]]: """Callable instance.""" @@ -161,7 +156,7 @@ def asynciotask( @typing.overload # noqa: F811 def asynciotask( - func: typing.Callable, + func: typing.Callable[..., typing.Awaitable], *, loop_getter: typing.Union[ typing.Callable[..., asyncio.AbstractEventLoop], @@ -175,7 +170,7 @@ def asynciotask( # pylint: enable=unused-argument def asynciotask( # noqa: F811 - func: typing.Optional[typing.Callable] = None, + func: typing.Optional[typing.Callable[..., typing.Awaitable]] = None, *, loop_getter: typing.Union[ typing.Callable[..., asyncio.AbstractEventLoop], @@ -186,7 +181,7 @@ def asynciotask( # noqa: F811 """Wrap function in future and return. :param func: Function to wrap - :type func: typing.Optional[typing.Callable] + :type func: typing.Optional[typing.Callable[..., typing.Awaitable]] :param loop_getter: Method to get event loop, if wrap in asyncio task :type loop_getter: typing.Union[ typing.Callable[..., asyncio.AbstractEventLoop], @@ -208,4 +203,4 @@ def asynciotask( # noqa: F811 loop_getter=loop_getter, loop_getter_need_context=loop_getter_need_context )(func) -# pylint: enable=unexpected-keyword-arg, no-value-for-parameter, function-redefined +# pylint: enable=function-redefined diff --git a/threaded/_class_decorator.py b/threaded/_class_decorator.py index 30fee49..eb75617 100644 --- a/threaded/_class_decorator.py +++ b/threaded/_class_decorator.py @@ -83,29 +83,32 @@ def __init__( @property def _func( self - ) -> typing.Optional[typing.Callable]: + ) -> typing.Optional[typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]]]: """Get wrapped function. - :rtype: typing.Optional[typing.Callable] + :rtype: typing.Optional[typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]]] """ return self.__func # pragma: no cover @abc.abstractmethod def _get_function_wrapper( self, - func: typing.Callable + func: typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]] ) -> typing.Callable: """Here should be constructed and returned real decorator. :param func: Wrapped function - :type func: typing.Callable + :type func: typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]] :rtype: typing.Callable """ raise NotImplementedError() # pragma: no cover def __call__( self, - *args: typing.Union[typing.Callable, typing.Any], + *args: typing.Union[ + typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]], + typing.Any + ], **kwargs: typing.Any ) -> typing.Any: """Main decorator getter.""" @@ -122,7 +125,9 @@ def __call__( return wrapper @staticmethod - def _await_if_required(target: typing.Callable) -> typing.Callable[..., typing.Any]: + def _await_if_required( + target: typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]] + ) -> typing.Callable[..., typing.Any]: """Await result if coroutine was returned.""" @functools.wraps(target) def wrapper( diff --git a/threaded/_gthreadpooled.py b/threaded/_gthreadpooled.py index 8281992..e4f92e4 100644 --- a/threaded/_gthreadpooled.py +++ b/threaded/_gthreadpooled.py @@ -39,9 +39,8 @@ class GThreadPooled(_base_threaded.APIPooled): __executor = None # type: typing.Optional[gevent.threadpool.ThreadPool] - # pylint: disable=arguments-differ @classmethod - def configure( + def configure( # pylint: disable=arguments-differ cls: typing.Type['GThreadPooled'], max_workers: typing.Optional[int] = None, hub: typing.Optional[gevent.hub.Hub] = None @@ -70,8 +69,6 @@ def configure( hub=hub ) - # pylint: enable=arguments-differ - @classmethod def shutdown(cls: typing.Type['GThreadPooled']) -> None: """Shutdown executor. @@ -93,32 +90,33 @@ def executor(self) -> gevent.threadpool.ThreadPool: def _get_function_wrapper( self, - func: typing.Callable + func: typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]] ) -> typing.Callable[..., gevent.event.AsyncResult]: """Here should be constructed and returned real decorator. :param func: Wrapped function - :type func: typing.Callable + :type func: typing.Callable[..., typing.Union[typing.Awaitable, typing.Any] :return: wrapped coroutine or function :rtype: typing.Callable[..., gevent.event.AsyncResult] """ prepared = self._await_if_required(func) - # pylint: disable=missing-docstring # noinspection PyMissingOrEmptyDocstring - @functools.wraps(prepared) + @functools.wraps(prepared) # pylint: disable=missing-docstring def wrapper( *args, # type: typing.Any **kwargs # type: typing.Any ) -> gevent.event.AsyncResult: return self.executor.spawn(prepared, *args, **kwargs) - # pylint: enable=missing-docstring return wrapper def __call__( # pylint: disable=useless-super-delegation self, - *args: typing.Union[typing.Callable, typing.Any], + *args: typing.Union[ + typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]], + typing.Any + ], **kwargs: typing.Any ) -> typing.Union[gevent.event.AsyncResult, typing.Callable[..., gevent.event.AsyncResult]]: """Callable instance.""" @@ -127,7 +125,9 @@ def __call__( # pylint: disable=useless-super-delegation # pylint: disable=function-redefined, unused-argument @typing.overload -def gthreadpooled(func: typing.Callable) -> typing.Callable[..., gevent.event.AsyncResult]: +def gthreadpooled( + func: typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]] +) -> typing.Callable[..., gevent.event.AsyncResult]: """Overloaded: func provided.""" pass # pragma: no cover @@ -139,9 +139,8 @@ def gthreadpooled(func: None = None) -> GThreadPooled: # pylint: enable=unused-argument -# pylint: disable=unexpected-keyword-arg, no-value-for-parameter def gthreadpooled( # noqa: F811 - func: typing.Optional[typing.Callable] = None + func: typing.Optional[typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]]] = None ) -> typing.Union[GThreadPooled, typing.Callable[..., gevent.event.AsyncResult]]: """Post function to gevent.threadpool.ThreadPool. @@ -153,4 +152,4 @@ def gthreadpooled( # noqa: F811 if func is None: return GThreadPooled(func=func) return GThreadPooled(func=None)(func) -# pylint: enable=unexpected-keyword-arg, no-value-for-parameter, function-redefined +# pylint: enable=function-redefined diff --git a/threaded/_threaded.py b/threaded/_threaded.py index 2e3e22b..c59ef34 100644 --- a/threaded/_threaded.py +++ b/threaded/_threaded.py @@ -40,7 +40,12 @@ class Threaded(_class_decorator.BaseDecorator): def __init__( self, - name: typing.Optional[typing.Union[str, typing.Callable]] = None, + name: typing.Optional[ + typing.Union[ + str, + typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]] + ] + ] = None, daemon: bool = False, started: bool = False, ) -> None: @@ -49,7 +54,7 @@ def __init__( :param name: New thread name. If callable: use as wrapped function. If none: use wrapped function name. - :type name: typing.Optional[typing.Union[str, typing.Callable]] + :type name: typing.Optional[typing.Union[str, typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]]]] :param daemon: Daemonize thread. :type daemon: bool :param started: Return started thread @@ -105,12 +110,12 @@ def __repr__(self) -> str: def _get_function_wrapper( self, - func: typing.Callable + func: typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]] ) -> typing.Callable[..., threading.Thread]: """Here should be constructed and returned real decorator. :param func: Wrapped function - :type func: typing.Callable + :type func: typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]] :return: wrapped function :rtype: typing.Callable[..., threading.Thread] """ @@ -123,9 +128,8 @@ def _get_function_wrapper( str(hash(func)) ) - # pylint: disable=missing-docstring # noinspection PyMissingOrEmptyDocstring - @functools.wraps(prepared) + @functools.wraps(prepared) # pylint: disable=missing-docstring def wrapper( *args, # type: typing.Any **kwargs # type: typing.Any @@ -141,12 +145,14 @@ def wrapper( thread.start() return thread - # pylint: enable=missing-docstring return wrapper def __call__( # pylint: disable=useless-super-delegation self, - *args: typing.Union[typing.Callable, typing.Any], + *args: typing.Union[ + typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]], + typing.Any + ], **kwargs: typing.Any ) -> typing.Union[threading.Thread, typing.Callable[..., threading.Thread]]: """Executable instance.""" @@ -200,4 +206,4 @@ def threaded( # noqa: F811 ) return Threaded(name=name, daemon=daemon, started=started)(func) # type: ignore return Threaded(name=name, daemon=daemon, started=started) -# pylint: enable=unexpected-keyword-arg, no-value-for-parameter, function-redefined +# pylint: enable=function-redefined diff --git a/threaded/_threadpooled.py b/threaded/_threadpooled.py index 0a5bfae..132b152 100644 --- a/threaded/_threadpooled.py +++ b/threaded/_threadpooled.py @@ -78,7 +78,7 @@ def executor(self) -> 'ThreadPoolExecutor': def __init__( self, - func: typing.Optional[typing.Callable] = None, + func: typing.Optional[typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]]] = None, *, loop_getter: typing.Optional[ typing.Union[ @@ -116,11 +116,7 @@ def loop_getter( ]: """Loop getter. - :rtype: typing.Union[ - None, - typing.Callable[..., asyncio.AbstractEventLoop], - asyncio.AbstractEventLoop - ] + :rtype: typing.Union[None, typing.Callable[..., asyncio.AbstractEventLoop], asyncio.AbstractEventLoop] """ return self.__loop_getter @@ -146,7 +142,7 @@ def _get_loop( def _get_function_wrapper( self, - func: typing.Callable + func: typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]] ) -> typing.Callable[..., typing.Union[concurrent.futures.Future, 'typing.Awaitable']]: """Here should be constructed and returned real decorator. @@ -157,9 +153,8 @@ def _get_function_wrapper( """ prepared = self._await_if_required(func) - # pylint: disable=missing-docstring # noinspection PyMissingOrEmptyDocstring - @functools.wraps(prepared) + @functools.wraps(prepared) # pylint: disable=missing-docstring def wrapper( *args: typing.Any, **kwargs: typing.Any @@ -180,12 +175,14 @@ def wrapper( ) ) - # pylint: enable=missing-docstring return wrapper def __call__( # pylint: disable=useless-super-delegation self, - *args: typing.Union[typing.Callable, typing.Any], + *args: typing.Union[ + typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]], + typing.Any + ], **kwargs: typing.Any ) -> typing.Union[ concurrent.futures.Future, 'typing.Awaitable', @@ -213,7 +210,7 @@ def __repr__(self) -> str: # pylint: disable=function-redefined, unused-argument @typing.overload def threadpooled( - func: typing.Callable, + func: typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]], *, loop_getter: None = None, loop_getter_need_context: bool = False @@ -224,7 +221,7 @@ def threadpooled( @typing.overload # noqa: F811 def threadpooled( - func: typing.Callable, + func: typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]], *, loop_getter: typing.Union[ typing.Callable[..., asyncio.AbstractEventLoop], @@ -252,9 +249,8 @@ def threadpooled( # pylint: enable=unused-argument -# pylint: disable=unexpected-keyword-arg, no-value-for-parameter def threadpooled( # noqa: F811 - func: typing.Optional[typing.Callable] = None, + func: typing.Optional[typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]]] = None, *, loop_getter: typing.Union[ None, @@ -269,7 +265,7 @@ def threadpooled( # noqa: F811 """Post function to ThreadPoolExecutor. :param func: function to wrap - :type func: typing.Optional[typing.Callable] + :type func: typing.Optional[typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]]] :param loop_getter: Method to get event loop, if wrap in asyncio task :type loop_getter: typing.Union[ None, @@ -292,7 +288,7 @@ def threadpooled( # noqa: F811 loop_getter=loop_getter, loop_getter_need_context=loop_getter_need_context )(func) -# pylint: enable=unexpected-keyword-arg, no-value-for-parameter, function-redefined +# pylint: enable=function-redefined class ThreadPoolExecutor(concurrent.futures.ThreadPoolExecutor): From df4b6bea31d0c3fe0c4e261c55ee31bb8543acf3 Mon Sep 17 00:00:00 2001 From: Alexey Stepanov Date: Tue, 11 Sep 2018 16:58:14 +0200 Subject: [PATCH 2/2] Python 3.4 do not have typing.Awaitable Signed-off-by: Alexey Stepanov --- threaded/_asynciotask.py | 10 +++++----- threaded/_class_decorator.py | 8 ++++---- threaded/_gthreadpooled.py | 8 ++++---- threaded/_threaded.py | 6 +++--- threaded/_threadpooled.py | 12 ++++++------ 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/threaded/_asynciotask.py b/threaded/_asynciotask.py index 8c83dfc..b415731 100644 --- a/threaded/_asynciotask.py +++ b/threaded/_asynciotask.py @@ -36,7 +36,7 @@ class AsyncIOTask(_class_decorator.BaseDecorator): def __init__( self, - func: typing.Optional[typing.Callable[..., typing.Awaitable]] = None, + func: typing.Optional[typing.Callable[..., 'typing.Awaitable']] = None, *, loop_getter: typing.Union[ typing.Callable[..., asyncio.AbstractEventLoop], @@ -95,7 +95,7 @@ def get_loop( def _get_function_wrapper( self, - func: typing.Callable[..., typing.Awaitable] + func: typing.Callable[..., 'typing.Awaitable'] ) -> typing.Callable[..., asyncio.Task]: """Here should be constructed and returned real decorator. @@ -117,7 +117,7 @@ def wrapper( def __call__( # pylint: disable=useless-super-delegation self, - *args: typing.Union[typing.Callable[..., typing.Awaitable], typing.Any], + *args: typing.Union[typing.Callable[..., 'typing.Awaitable'], typing.Any], **kwargs: typing.Any ) -> typing.Union[asyncio.Task, typing.Callable[..., asyncio.Task]]: """Callable instance.""" @@ -156,7 +156,7 @@ def asynciotask( @typing.overload # noqa: F811 def asynciotask( - func: typing.Callable[..., typing.Awaitable], + func: typing.Callable[..., 'typing.Awaitable'], *, loop_getter: typing.Union[ typing.Callable[..., asyncio.AbstractEventLoop], @@ -170,7 +170,7 @@ def asynciotask( # pylint: enable=unused-argument def asynciotask( # noqa: F811 - func: typing.Optional[typing.Callable[..., typing.Awaitable]] = None, + func: typing.Optional[typing.Callable[..., 'typing.Awaitable']] = None, *, loop_getter: typing.Union[ typing.Callable[..., asyncio.AbstractEventLoop], diff --git a/threaded/_class_decorator.py b/threaded/_class_decorator.py index eb75617..5b3d11b 100644 --- a/threaded/_class_decorator.py +++ b/threaded/_class_decorator.py @@ -83,7 +83,7 @@ def __init__( @property def _func( self - ) -> typing.Optional[typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]]]: + ) -> typing.Optional[typing.Callable[..., typing.Union['typing.Awaitable', typing.Any]]]: """Get wrapped function. :rtype: typing.Optional[typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]]] @@ -93,7 +93,7 @@ def _func( @abc.abstractmethod def _get_function_wrapper( self, - func: typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]] + func: typing.Callable[..., typing.Union['typing.Awaitable', typing.Any]] ) -> typing.Callable: """Here should be constructed and returned real decorator. @@ -106,7 +106,7 @@ def _get_function_wrapper( def __call__( self, *args: typing.Union[ - typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]], + typing.Callable[..., typing.Union['typing.Awaitable', typing.Any]], typing.Any ], **kwargs: typing.Any @@ -126,7 +126,7 @@ def __call__( @staticmethod def _await_if_required( - target: typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]] + target: typing.Callable[..., typing.Union['typing.Awaitable', typing.Any]] ) -> typing.Callable[..., typing.Any]: """Await result if coroutine was returned.""" @functools.wraps(target) diff --git a/threaded/_gthreadpooled.py b/threaded/_gthreadpooled.py index e4f92e4..4fda96b 100644 --- a/threaded/_gthreadpooled.py +++ b/threaded/_gthreadpooled.py @@ -90,7 +90,7 @@ def executor(self) -> gevent.threadpool.ThreadPool: def _get_function_wrapper( self, - func: typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]] + func: typing.Callable[..., typing.Union['typing.Awaitable', typing.Any]] ) -> typing.Callable[..., gevent.event.AsyncResult]: """Here should be constructed and returned real decorator. @@ -114,7 +114,7 @@ def wrapper( def __call__( # pylint: disable=useless-super-delegation self, *args: typing.Union[ - typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]], + typing.Callable[..., typing.Union['typing.Awaitable', typing.Any]], typing.Any ], **kwargs: typing.Any @@ -126,7 +126,7 @@ def __call__( # pylint: disable=useless-super-delegation # pylint: disable=function-redefined, unused-argument @typing.overload def gthreadpooled( - func: typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]] + func: typing.Callable[..., typing.Union['typing.Awaitable', typing.Any]] ) -> typing.Callable[..., gevent.event.AsyncResult]: """Overloaded: func provided.""" pass # pragma: no cover @@ -140,7 +140,7 @@ def gthreadpooled(func: None = None) -> GThreadPooled: # pylint: enable=unused-argument def gthreadpooled( # noqa: F811 - func: typing.Optional[typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]]] = None + func: typing.Optional[typing.Callable[..., typing.Union['typing.Awaitable', typing.Any]]] = None ) -> typing.Union[GThreadPooled, typing.Callable[..., gevent.event.AsyncResult]]: """Post function to gevent.threadpool.ThreadPool. diff --git a/threaded/_threaded.py b/threaded/_threaded.py index c59ef34..6e3bde7 100644 --- a/threaded/_threaded.py +++ b/threaded/_threaded.py @@ -43,7 +43,7 @@ def __init__( name: typing.Optional[ typing.Union[ str, - typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]] + typing.Callable[..., typing.Union['typing.Awaitable', typing.Any]] ] ] = None, daemon: bool = False, @@ -110,7 +110,7 @@ def __repr__(self) -> str: def _get_function_wrapper( self, - func: typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]] + func: typing.Callable[..., typing.Union['typing.Awaitable', typing.Any]] ) -> typing.Callable[..., threading.Thread]: """Here should be constructed and returned real decorator. @@ -150,7 +150,7 @@ def wrapper( def __call__( # pylint: disable=useless-super-delegation self, *args: typing.Union[ - typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]], + typing.Callable[..., typing.Union['typing.Awaitable', typing.Any]], typing.Any ], **kwargs: typing.Any diff --git a/threaded/_threadpooled.py b/threaded/_threadpooled.py index 132b152..da01ac1 100644 --- a/threaded/_threadpooled.py +++ b/threaded/_threadpooled.py @@ -78,7 +78,7 @@ def executor(self) -> 'ThreadPoolExecutor': def __init__( self, - func: typing.Optional[typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]]] = None, + func: typing.Optional[typing.Callable[..., typing.Union['typing.Awaitable', typing.Any]]] = None, *, loop_getter: typing.Optional[ typing.Union[ @@ -142,7 +142,7 @@ def _get_loop( def _get_function_wrapper( self, - func: typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]] + func: typing.Callable[..., typing.Union['typing.Awaitable', typing.Any]] ) -> typing.Callable[..., typing.Union[concurrent.futures.Future, 'typing.Awaitable']]: """Here should be constructed and returned real decorator. @@ -180,7 +180,7 @@ def wrapper( def __call__( # pylint: disable=useless-super-delegation self, *args: typing.Union[ - typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]], + typing.Callable[..., typing.Union['typing.Awaitable', typing.Any]], typing.Any ], **kwargs: typing.Any @@ -210,7 +210,7 @@ def __repr__(self) -> str: # pylint: disable=function-redefined, unused-argument @typing.overload def threadpooled( - func: typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]], + func: typing.Callable[..., typing.Union['typing.Awaitable', typing.Any]], *, loop_getter: None = None, loop_getter_need_context: bool = False @@ -221,7 +221,7 @@ def threadpooled( @typing.overload # noqa: F811 def threadpooled( - func: typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]], + func: typing.Callable[..., typing.Union['typing.Awaitable', typing.Any]], *, loop_getter: typing.Union[ typing.Callable[..., asyncio.AbstractEventLoop], @@ -250,7 +250,7 @@ def threadpooled( # pylint: enable=unused-argument def threadpooled( # noqa: F811 - func: typing.Optional[typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]]] = None, + func: typing.Optional[typing.Callable[..., typing.Union['typing.Awaitable', typing.Any]]] = None, *, loop_getter: typing.Union[ None,