This is an automated email from the ASF dual-hosted git repository. fokko pushed a commit to branch pyiceberg-0.9.x in repository https://gitbox.apache.org/repos/asf/iceberg-python.git
commit e9745d5f63f4841ba725ca76343a8e3ac5574e6b Author: b-rick <[email protected]> AuthorDate: Fri Apr 4 17:44:28 2025 +1100 Fix creation of Bucket Transforms with `pydantic>=2.11.0` (#1881) ## Rationale For This Change When using pydantic>=2.11.0, we get an error when creating bucket transforms. In this version, it's illegal to access self before calling super. To fix this, we just need to ensure we call `super().__init__` before setting field properties on `self`. --- ## Before Using `pydantic==2.11.0` the test `test_transforms.py::test_bucket_hash_values` fails ```python tests/test_transforms.py:None (tests/test_transforms.py) test_transforms.py:179: in <module> (BucketTransform(2).transform(IntegerType()), 0, 0), ../pyiceberg/transforms.py:237: in __init__ self._num_buckets = num_buckets ../../../miniforge3/envs/pyiceberg/lib/python3.12/site-packages/pydantic/main.py:991: in __setattr__ setattr_handler(self, name, value) # call here to not memo on possibly unknown fields ../../../miniforge3/envs/pyiceberg/lib/python3.12/site-packages/pydantic/main.py:105: in <lambda> 'private': lambda model, name, val: model.__pydantic_private__.__setitem__(name, val), # pyright: ignore[reportOptionalMemberAccess] E AttributeError: 'NoneType' object has no attribute '__setitem__'. Did you mean: '__setattr__'? ``` --- ## After Using `pydantic==2.11.0` the test `test_transforms.py::test_bucket_hash_values` succeeds. --- ✅ Are these changes tested? Yes - No test was added to reproduce the bug because it is already reproducible with the existing test Co-authored-by: Zac Sanchez <[email protected]> --- pyiceberg/transforms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyiceberg/transforms.py b/pyiceberg/transforms.py index b8f0b975..7dfe7514 100644 --- a/pyiceberg/transforms.py +++ b/pyiceberg/transforms.py @@ -232,8 +232,8 @@ class BucketTransform(Transform[S, int]): _num_buckets: PositiveInt = PrivateAttr() def __init__(self, num_buckets: int, **data: Any) -> None: - self._num_buckets = num_buckets super().__init__(f"bucket[{num_buckets}]", **data) + self._num_buckets = num_buckets @property def num_buckets(self) -> int:
