I am trying to pass a list of strings from one task to another one via XCom but I do not seem to manage to get the pushed list interpreted back as a list.
For example, when I do this in some function blah
that is run in a ShortCircuitOperator
:
paths = ['gs://{}/{}'.format(bucket, obj) for obj in my_list]
kwargs['ti'].xcom_push(key='return_value', value=full_paths)
and then I want to use such list as a parameter of an operator. For example,
run_task_after_blah = AfterBlahOperator(
task_id='run-task-after-blah',
...,
input_paths="{{ ti.xcom_pull(task_ids='find-paths') }}",
...,
)
I expect input_paths
to be equal to paths
but it does not because the rendering happens firs and then assignment, and somewhat the template rendering converts the xcom_pull
return to a stringified list (and thereafter my AfterBlahOperator
inserts assigns that as the value of an element in a JSON.
I tried concatenating the paths
into one string separated by some separator and pushing that to the XCom and then splitting that back when pulling from the XCom but as the XCom gets rendered first, I get, either that stringified list when the split
function is called inside the template or the original concatenated string of paths
if the split
function is applied to the parameter (as in "{{ ti.xcom_pull(task_ids='find-paths') }}".split(';')
.
XCom seems to work great for single values as task parameters or multiple values when the extracted values can be further processed but not for multiple_values to convert into 'one' as parameter of a task.
Is there a way to do this without having to write an extra function that precisely returns such list of strings? Or maybe I am abusing XCom too much, but there are many operators in Airflow that take a list of elements as parameter (e.g., usually the full path to multiple files that are the result of some previous task, hence not known beforehand).