def test_parameters_and_defaults(): ctx = context_manager.FlyteContext.current_context() def z(a: int, b: str) -> typing.Tuple[int, str]: ... our_interface = transform_signature_to_interface(inspect.signature(z)) params = transform_inputs_to_parameters(ctx, our_interface) assert params.parameters["a"].required assert params.parameters["a"].default is None assert params.parameters["b"].required assert params.parameters["b"].default is None def z(a: int, b: str = "hello") -> typing.Tuple[int, str]: ... our_interface = transform_signature_to_interface(inspect.signature(z)) params = transform_inputs_to_parameters(ctx, our_interface) assert params.parameters["a"].required assert params.parameters["a"].default is None assert not params.parameters["b"].required assert params.parameters[ "b"].default.scalar.primitive.string_value == "hello" def z(a: int = 7, b: str = "eleven") -> typing.Tuple[int, str]: ... our_interface = transform_signature_to_interface(inspect.signature(z)) params = transform_inputs_to_parameters(ctx, our_interface) assert not params.parameters["a"].required assert params.parameters["a"].default.scalar.primitive.integer == 7 assert not params.parameters["b"].required assert params.parameters[ "b"].default.scalar.primitive.string_value == "eleven"
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, **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") 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" ) 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, **kwargs, ) self._task_function = task_function self._execution_mode = execution_mode
def __init__( self, workflow_function: Callable, metadata: Optional[WorkflowMetadata], default_metadata: Optional[WorkflowMetadataDefaults], ): name = f"{workflow_function.__module__}.{workflow_function.__name__}" self._workflow_function = workflow_function native_interface = transform_signature_to_interface(inspect.signature(workflow_function)) # TODO do we need this - can this not be in launchplan only? # This can be in launch plan only, but is here only so that we don't have to re-evaluate. Or # we can re-evaluate. self._input_parameters = None super().__init__( name=name, workflow_metadata=metadata, workflow_metadata_defaults=default_metadata, python_interface=native_interface, )
def __init__( self, workflow_function: Callable, metadata: Optional[WorkflowMetadata], default_metadata: Optional[WorkflowMetadataDefaults], ): self._name = f"{workflow_function.__module__}.{workflow_function.__name__}" self._workflow_function = workflow_function self._native_interface = transform_signature_to_interface( inspect.signature(workflow_function)) self._interface = transform_interface_to_typed_interface( self._native_interface) # These will get populated on compile only self._nodes = None self._output_bindings: Optional[List[_literal_models.Binding]] = None self._workflow_metadata = metadata self._workflow_metadata_defaults = default_metadata # TODO do we need this - can this not be in launchplan only? # This can be in launch plan only, but is here only so that we don't have to re-evaluate. Or # we can re-evaluate. self._input_parameters = None FlyteEntities.entities.append(self)
def wrapper(fn) -> ReferenceTask: interface = transform_signature_to_interface(inspect.signature(fn)) return ReferenceTask(project, domain, name, version, interface.inputs, interface.outputs)