PythonTask - Базовый класс для выполняемой задачи
=============================================================

.. currentmodule:: axioma.core

.. class:: PythonTask

    Связывает вместе пользовательскую функцию и аргументы к ней для отложенного
    выполнения. Если внутри пользовательской функции возникло исключение, то 
    задача корректно завершиться с сообщением об ошибке. Эту ситуацию можно 
    обработать отдельно если подписаться на сигнал :meth:`~axioma.core.PythonProgressHandler.pythonError` 

    .. method:: PythonTask(fn, *args, **kwargs)

        Конструктор принимающий пользовательскую функцию и аргументы к ней

        :param fn: Пользовательская функция
        :type fn: :class:`function`
        :param args: Набор аргументов которые будут переданы в пользовательскую функцию при вызове
        :type args: :class:`tuple`
        :param kwargs: Словарь который будет передан в пользовательскую функцию при вызове
        :type kwargs: :class:`dict`

    .. method:: set_progress_handler(progressHandler)

        Устанавливает пользовательский обработчик прогресса операции

        :param progressHandler: Обработчик прогресса операции
        :type progressHandler: :class:`~axioma.core.PythonProgressHandler`

    .. method:: run_impl(fn, *args, **kwargs)

        Выполняет пользовательскую функцию, вызыватся из :meth:`~onStart`
        используется в наследниках для переопределния поведения. Например :class:`~axioma.core.PythonTaskManageable`

        :type fn: :class:`function`
        :param args: Набор аргументов которые будут переданы в пользовательскую функцию при вызове
        :type args: :class:`tuple`
        :param kwargs: Словарь который будет передан в пользовательскую функцию при вызове
        :type kwargs: :class:`dict`

    .. method:: onStart()

        Переопределяет метод базового класса :class:`~axioma.core.Task`. 
        Внутри этого метода вызывается абстрактный метод :meth:`~run_impl` 
        который запускает выполнение пользовательской функции.  
        Этот метод не выбрасывает исключения. Все исключения выборошенные 
        пользовательской функцией ловятся, а в лог выводится стек
        с ошибкой. Так же можно подписаться на сигнал :meth:`~axioma.core.PythonProgressHandler.pythonError`
        для ручной обработки ошибок


    .. attribute:: progressHandler

        Обработчик прогресса операции

        :type: :class:`~axioma.core.PythonProgressHandler`

