Three properties name a class that PyIceberg imports and calls:
| Property |
Resolved by |
Called as |
py-io-impl |
_import_file_io (pyiceberg/io/__init__.py) |
class_(properties) |
write.py-location-provider.impl |
_import_location_provider (pyiceberg/table/locations.py) |
class_(table_location, table_properties) |
s3.retry-strategy-impl |
_import_retry_strategy (pyiceberg/io/pyarrow.py) |
class_() |
Each follows the same pattern:
module = importlib.import_module(module_name)
class_ = getattr(module, class_name)
return class_(...)
None of the three checks that the resolved object is the type it is about to be used as — there is no issubclass against FileIO, LocationProvider, or S3RetryStrategy. Any importable dotted name resolves and is called, with the property map passed as an argument in two of the three cases.
All three properties are read from the merged table property map, so their values can originate in a table's metadata rather than in the operator's catalog configuration.
Issue investigation generated via claude, reviewed by Sung, Kevin, Fokko.
Three properties name a class that PyIceberg imports and calls:
py-io-impl_import_file_io(pyiceberg/io/__init__.py)class_(properties)write.py-location-provider.impl_import_location_provider(pyiceberg/table/locations.py)class_(table_location, table_properties)s3.retry-strategy-impl_import_retry_strategy(pyiceberg/io/pyarrow.py)class_()Each follows the same pattern:
None of the three checks that the resolved object is the type it is about to be used as — there is no
issubclassagainstFileIO,LocationProvider, orS3RetryStrategy. Any importable dotted name resolves and is called, with the property map passed as an argument in two of the three cases.All three properties are read from the merged table property map, so their values can originate in a table's metadata rather than in the operator's catalog configuration.
Issue investigation generated via claude, reviewed by Sung, Kevin, Fokko.