Skip to content

Commit

Permalink
refactor: propagate attrs & behavior with dict-like ak.Array input …
Browse files Browse the repository at this point in the history
…data (#3374)

* refactor: propagate attrs & behavior from given input arrays in the same way as ak.zip

* add test
  • Loading branch information
pfackeldey authored Jan 20, 2025
1 parent 6c01d57 commit f06dad9
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 6 deletions.
15 changes: 9 additions & 6 deletions src/awkward/highlevel.py
Original file line number Diff line number Diff line change
Expand Up @@ -302,19 +302,22 @@ def __init__(

elif isinstance(data, dict):
fields = []
contents = []
_arrays = []
length = None
for k, v in data.items():
fields.append(k)
contents.append(Array(v).layout)
_arrays.append(Array(v))
if length is None:
length = contents[-1].length
elif length != contents[-1].length:
length = _arrays[-1].layout.length
elif length != _arrays[-1].layout.length:
raise ValueError(
"dict of arrays in ak.Array constructor must have arrays "
f"of equal length ({length} vs {contents[-1].length})"
f"of equal length ({length} vs {_arrays[-1].layout.length}). "
"For automatic broadcasting use 'ak.zip' instead. "
)
layout = ak.contents.RecordArray(contents, fields)
layout = ak.contents.RecordArray([arr.layout for arr in _arrays], fields)
attrs = attrs_of(*_arrays, attrs=attrs)
behavior = behavior_of(*_arrays, behavior=behavior)

elif isinstance(data, str):
layout = ak.operations.from_json(data, highlevel=False)
Expand Down
32 changes: 32 additions & 0 deletions tests/test_3374_propagate_metadata_akArray_dictlike_data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# BSD 3-Clause License; see https://github.com/scikit-hep/awkward/blob/main/LICENSE
# ruff: noqa: E402

from __future__ import annotations

import awkward as ak


def test_attrs():
x = ak.Array([1], attrs={"me": "ta"})
y = ak.Array([1], attrs={"da": "ta"})

rec = ak.Array({"x": x, "y": y})
assert rec.attrs == {"me": "ta", "da": "ta"}

# overwrite attrs:
rec = ak.Array({"x": x, "y": y}, attrs={"foo": "bar"})
assert rec.attrs == {"foo": "bar"}


def test_behaviors():
behavior = {"foo": object()}
x = ak.Array([1], behavior=behavior)
y = ak.Array([1], behavior=behavior)

rec = ak.Array({"x": x, "y": y})
assert rec.behavior == behavior

# overwrite behavior:
behavior2 = {"bar": object()}
rec = ak.Array({"x": x, "y": y}, behavior=behavior2)
assert rec.behavior == behavior2

0 comments on commit f06dad9

Please sign in to comment.