ITADN

copy.deepcopy() raises TypeError on And, Or, Not expressions

#3297Closedrobreeves 创建于 2026-04-28
R
robreevescommented
### Apache Iceberg version None ### Please describe the bug 🐞 `copy.deepcopy()` on `And`, `Or`, or `Not` raises `TypeError` because Pydantic v2's `BaseModel.__deepcopy__` calls `cls.__new__(cls)` with no args, but these classes require positional arguments in `__new__`. ```python import copy from pyiceberg.expressions import And, EqualTo copy.deepcopy(And(EqualTo("x", 1), EqualTo("y", 2))) # TypeError: And.__new__() missing 2 required positional arguments: 'left' and 'right' ``` **Use case** We use PyIceberg to load data for model training in [Ray](https://docs.ray.io/en/latest/index.html). As part of this we have PyIceberg filters that are pushed down to dataset reads as part of a config object. Ray is doing a deep copy and we hit this issue. Other PyIceberg filters don't have this issue because they don't override `__new__`. ``` File "/export/apps/python/3.12/lib/python3.12/site-packages/ray/train/v2/api/data_parallel_trainer.py", line 179, in fit callbacks=self._create_default_callbacks(), File "/export/apps/python/3.12/lib/python3.12/site-packages/ray/train/v2/api/data_parallel_trainer.py", line 206, in _create_default_callbacks datasets_callback = DatasetsSetupCallback( File "/export/apps/python/3.12/lib/python3.12/site-packages/ray/train/v2/_internal/callbacks/datasets.py", line 54, in __init__ self._data_config = copy.deepcopy(train_run_context.dataset_config) File "/export/apps/python/3.12/lib/python3.12/copy.py", line 162, in deepcopy y = _reconstruct(x, memo, *rv) File "/export/apps/python/3.12/lib/python3.12/copy.py", line 259, in _reconstruct state = deepcopy(state, memo) File "/export/apps/python/3.12/lib/python3.12/copy.py", line 136, in deepcopy y = copier(x, memo) File "/export/apps/python/3.12/lib/python3.12/copy.py", line 221, in _deepcopy_dict y[deepcopy(key, memo)] = deepcopy(value, memo) File "/export/apps/python/3.12/lib/python3.12/copy.py", line 136, in deepcopy y = copier(x, memo) File "/export/apps/python/3.12/lib/python3.12/copy.py", line 196, in _deepcopy_list append(deepcopy(a, memo)) File "/export/apps/python/3.12/lib/python3.12/copy.py", line 162, in deepcopy y = _reconstruct(x, memo, *rv) File "/export/apps/python/3.12/lib/python3.12/copy.py", line 259, in _reconstruct state = deepcopy(state, memo) File "/export/apps/python/3.12/lib/python3.12/copy.py", line 136, in deepcopy y = copier(x, memo) File "/export/apps/python/3.12/lib/python3.12/copy.py", line 221, in _deepcopy_dict y[deepcopy(key, memo)] = deepcopy(value, memo) File "/export/apps/python/3.12/lib/python3.12/copy.py", line 162, in deepcopy y = _reconstruct(x, memo, *rv) File "/export/apps/python/3.12/lib/python3.12/copy.py", line 253, in _reconstruct y = func(*args) File "/export/apps/python/3.12/lib/python3.12/copy.py", line 252, in <genexpr> args = (deepcopy(arg, memo) for arg in args) File "/export/apps/python/3.12/lib/python3.12/copy.py", line 143, in deepcopy y = copier(memo) File "/export/apps/python/3.12/lib/python3.12/site-packages/pydantic/main.py", line 977, in __deepcopy__ m = cls.__new__(cls) TypeError: And.__new__() missing 2 required positional arguments: 'left' and 'right' ``` ### Willingness to contribute - [ ] I can contribute a fix for this bug independently - [ ] I would be willing to contribute a fix for this bug with guidance from the Iceberg community - [ ] I cannot contribute a fix for this bug at this time
关闭于 2026-05-04 4 条评论