def test_isnested(): def inner_foo(): pass assert isnested(foo) is False assert isnested(inner_foo) is True # Uses tasks.tasks method with pytest.raises(ValueError): tasks.tasks()
def __init__( self, task_config: T, task_function: Callable, task_type="python-task", ignore_input_vars: Optional[List[str]] = None, execution_mode: Optional[ExecutionBehavior] = ExecutionBehavior. DEFAULT, task_resolver: Optional[TaskResolverMixin] = None, **kwargs, ): """ :param T task_config: Configuration object for Task. Should be a unique type for that specific Task :param Callable task_function: Python function that has type annotations and works for the task :param Optional[List[str]] ignore_input_vars: When supplied, these input variables will be removed from the interface. This can be used to inject some client side variables only. Prefer using ExecutionParams :param Optional[ExecutionBehavior] execution_mode: Defines how the execution should behave, for example executing normally or specially handling a dynamic case. :param Optional[TaskResolverMixin] task_type: String task type to be associated with this Task """ if task_function is None: raise ValueError( "TaskFunction is a required parameter for PythonFunctionTask") self._native_interface = transform_function_to_interface( task_function, Docstring(callable_=task_function)) mutated_interface = self._native_interface.remove_inputs( ignore_input_vars) name, _, _, _ = extract_task_module(task_function) super().__init__( task_type=task_type, name=name, interface=mutated_interface, task_config=task_config, task_resolver=task_resolver, **kwargs, ) if self._task_resolver is default_task_resolver: # The default task resolver can't handle nested functions # TODO: Consider moving this to a can_handle function or something inside the resolver itself. if (not istestfunction(func=task_function) and isnested(func=task_function) and not is_functools_wrapped_module_level(task_function)): raise ValueError( "TaskFunction cannot be a nested/inner or local function. " "It should be accessible at a module level for Flyte to execute it. Test modules with " "names beginning with `test_` are allowed to have nested tasks. " "If you're decorating your task function with custom decorators, use functools.wraps " "or functools.update_wrapper on the function wrapper. " "Alternatively if you want to create your own tasks with custom behavior use the TaskResolverMixin" ) self._task_function = task_function self._execution_mode = execution_mode
def __init__( self, task_config: T, task_function: Callable, task_type="python-task", ignore_input_vars: Optional[List[str]] = None, execution_mode: Optional[ExecutionBehavior] = ExecutionBehavior. DEFAULT, task_resolver: Optional[TaskResolverMixin] = None, **kwargs, ): """ :param task_config: Configuration object for Task. Should be a unique type for that specific Task :param task_function: Python function that has type annotations and works for the task :param ignore_input_vars: When supplied, these input variables will be removed from the interface. This can be used to inject some client side variables only. Prefer using ExecutionParams :param task_type: String task type to be associated with this Task """ if task_function is None: raise ValueError( "TaskFunction is a required parameter for PythonFunctionTask") self._native_interface = transform_signature_to_interface( inspect.signature(task_function)) mutated_interface = self._native_interface.remove_inputs( ignore_input_vars) super().__init__( task_type=task_type, name=f"{task_function.__module__}.{task_function.__name__}", interface=mutated_interface, task_config=task_config, task_resolver=task_resolver, **kwargs, ) if self._task_resolver is default_task_resolver: # The default task resolver can't handle nested functions # TODO: Consider moving this to a can_handle function or something inside the resolver itself. if not istestfunction(func=task_function) and isnested( func=task_function): raise ValueError( "TaskFunction cannot be a nested/inner or local function. " "It should be accessible at a module level for Flyte to execute it. Test modules with " "names begining with `test_` are allowed to have nested tasks. If you want to create your own tasks" "use the TaskResolverMixin") self._task_function = task_function self._execution_mode = execution_mode