Jeff
12/14/2022, 9:49 PM@asset
. Details in 🧵@asset(
metadata={"data1": ["foo", "bar"], "data2": []},
)
def example_asset(context: OpExecutionContext):
I have an IO manager that gets the metadata from an upstream asset like:
metadata = context.metadata if isinstance(context, OutputContext) else context.upstream_output.metadata
When I get the field
data1 = metadata["data1"]
the value of data1
is a string [list] (unserializable)
jamie
12/14/2022, 9:57 PMJeff
12/19/2022, 5:41 PMjamie
12/19/2022, 5:41 PMexample_asset
in the load_input
function of your IO manager, the value of the metadata data1
is the literal string "[list] (unserializable)"
? and in other cases you get the list of strings as expected?Jeff
12/19/2022, 8:18 PMdata1
on its own, the metadata is correct. This should be unique to context.upstream_output.metadata
in load_input
usage cases.jamie
12/19/2022, 8:19 PMdef test_metadata_io_manager():
expected_metadata = {"data1": ["foo", "bar"], "data2": []}
@asset(
metadata=expected_metadata,
)
def upstream():
return 1
@asset
def downstream(upstream):
return upstream + 1
class MyIOManager(IOManager):
def __init__(self):
self.values = dict()
def handle_output(self, context, obj):
keys = tuple(context.get_identifier())
self.values[keys] = obj
def load_input(self, context):
assert context.upstream_output is not None
metadata = context.metadata if isinstance(context, OutputContext) else context.upstream_output.metadata
assert metadata == expected_metadata
keys = tuple(context.get_identifier())
return self.values[keys]
materialize([upstream, downstream], resources={"io_manager":IOManagerDefinition.hardcoded_io_manager(MyIOManager())})
is there something i’m missing in my setup compared to what you’re doing? what version of dagster are you running?Jeff
12/19/2022, 8:47 PMjamie
12/19/2022, 8:48 PMJeff
12/19/2022, 8:51 PMjamie
12/19/2022, 8:55 PMJeff
12/19/2022, 8:56 PMjamie
12/19/2022, 8:56 PM@asset(
metadata={"data1": {"val": ["foo", "bar"]}}
)
Jeff
12/21/2022, 4:50 PMjamie
12/21/2022, 4:50 PMJeff
01/09/2023, 4:41 PM[list] (unserializable)
is normalize_metatdata
in _core/definitions/metadata/__init__.py
; it appears that normalize_metadata_value
does not support lists, so I suspect this is the source of the issue.jamie
01/09/2023, 4:43 PM