Skip to content

Error when trying to return a tuple or an object in a fairstep #200

@vemonet

Description

@vemonet

I am facing issues when trying to return a tuple or an object, to return multiple value for a step, which is quite a common practice

  • When trying to return a tuple:
@is_fairstep(label='Load data', is_script_task=True)
def load_data():
    data, y = load_iris(return_X_y=True, as_frame=True)
    return data, y

@is_fairworkflow(label='My model training workflow')
def training_workflow(n_jobs: int):
    data, y = load_data()

I am getting this error:

Traceback (most recent call last):
  File "python3.9/site-packages/fairworkflows/fairworkflow.py", line 502, in _validate_decorated_function
    result = func(*empty_args)
  File "my-model/src/my_model/train.py", line 83, in training_workflow
    data, y = load_data()
  File "python3.9/site-packages/noodles/interface/decorator.py", line 276, in __iter__
    raise TypeError(
TypeError: You have tried to iterate (or unpack) a PromisedObject. There is currently no possible way to learn the length of a PromisedObject so, sadly, this is not implemented. You may use the `noodles.unpack` function to unpack a promised tuple.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "my-model/src/my_model/train.py", line 75, in <module>
    def training_workflow(n_jobs: int):
  File "python3.9/site-packages/fairworkflows/fairworkflow.py", line 482, in _modify_function
    _validate_decorated_function(func, empty_args)
  File "python3.9/site-packages/fairworkflows/fairworkflow.py", line 504, in _validate_decorated_function
    raise TypeError("Marking the function as workflow with `is_fairworkflow` decorator "
TypeError: Marking the function as workflow with `is_fairworkflow` decorator failed. Did you use the is_fairstep decorator on all the steps? Detailed error message: You have tried to iterate (or unpack) a PromisedObject. There is currently no possible way to learn the length of a PromisedObject so, sadly, this is not implemented. You may use the `noodles.unpack` function to unpack a promised tuple.
  • If I try to use noodle.unpack:
from noodles import unpack

@is_fairstep(label='Load data', is_script_task=True)
def load_data():
    data, y = load_iris(return_X_y=True, as_frame=True)
    return data, y

@is_fairworkflow(label='My model training workflow')
def training_workflow(n_jobs: int):
    data, y = unpack(load_data(), 2)

I am getting this error:

Traceback (most recent call last):
  File "my-model/src/my_model/train.py", line 76, in <module>
    def training_workflow(n_jobs: int):
  File "python3.9/site-packages/fairworkflows/fairworkflow.py", line 487, in _modify_function
    workflow_level_promise._fairworkflow = FairWorkflow.from_noodles_promise(
  File "python3.9/site-packages/fairworkflows/fairworkflow.py", line 107, in from_noodles_promise
    steps_dict = {i: n.foo._fairstep for i, n in workflow.nodes.items()}
  File "python3.9/site-packages/fairworkflows/fairworkflow.py", line 107, in <dictcomp>
    steps_dict = {i: n.foo._fairstep for i, n in workflow.nodes.items()}
AttributeError: 'function' object has no attribute '_fairstep'
  • When trying to return an object:
@is_fairstep(label='Load data', is_script_task=True)
def load_data():
    data, y = load_iris(return_X_y=True, as_frame=True)
    return {
        "data": data,
        "y": y
    }

I am getting the following error:

Traceback (most recent call last):
  File "my-model/src/my_model/train.py", line 75, in <module>
    def training_workflow(n_jobs: int):
  File "python3.9/site-packages/fairworkflows/fairworkflow.py", line 487, in _modify_function
    workflow_level_promise._fairworkflow = FairWorkflow.from_noodles_promise(
  File "python3.9/site-packages/fairworkflows/fairworkflow.py", line 107, in from_noodles_promise
    steps_dict = {i: n.foo._fairstep for i, n in workflow.nodes.items()}
  File "python3.9/site-packages/fairworkflows/fairworkflow.py", line 107, in <dictcomp>
    steps_dict = {i: n.foo._fairstep for i, n in workflow.nodes.items()}
AttributeError: 'function' object has no attribute '_fairstep'

@raar1 what would be the recommended to pass multiple objects in a fairstep return statement?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions