Skip to content

Commit 5fc51bc

Browse files
committed
RF: Adjust zstd_open function to accept level/option parameters, and to
normalise level_or_option/level/option arguments - working around API difference between pyzstd and compression.zstd
1 parent dfaddb8 commit 5fc51bc

File tree

2 files changed

+52
-3
lines changed

2 files changed

+52
-3
lines changed

nibabel/_compression.py

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ def gzip_open(
124124
125125
filename : str
126126
Path of file to open.
127-
mode : Mode
127+
mode : str
128128
Opening mode - either ``rb`` or ``wb``.
129129
compresslevel: int
130130
Compression level when writing.
@@ -153,5 +153,53 @@ def zstd_open(
153153
*,
154154
level_or_option: int | dict | None = None,
155155
zstd_dict: zstd.ZstdDict | None = None,
156+
level : int = None,
157+
options : dict = None,
156158
) -> zstd.ZstdFile:
157-
return zstd.ZstdFile(filename, mode, level_or_option=level_or_option, zstd_dict=zstd_dict)
159+
"""Open a zstd file for reading or writing.
160+
161+
The specific object type returned depends on which module out of
162+
``compression.zstd``, ``backports.zstd``, or ``pyzstd`` is available.
163+
164+
At most one of the ``level_or_options``, ``level``, or
165+
``options`` parameters may be provided - a ``ValueError`` will be raised
166+
if more than one is specified.
167+
168+
Parameters
169+
----------
170+
171+
filename : str
172+
Path of file to open.
173+
mode : str
174+
Opening mode.
175+
level_or_option: int or dict
176+
Compression level or dictionary containing options (see also the
177+
level and options parameters).
178+
zstd_dict : ZstdDict
179+
Dictionary used for compression/decompression.
180+
level : int
181+
Compression level when writing.
182+
options : dict
183+
Dictionary of compression/decompression options.
184+
"""
185+
level_or_option_provided = sum((level_or_option is not None,
186+
level is not None,
187+
options is not None))
188+
if level_or_option_provided > 1:
189+
raise ValueError(
190+
'Only one of level_or_option, level, or options may be specified')
191+
# pyzstd accepts level_or_option, but compression.zstd/backports.zstd
192+
# expects level or options
193+
level_or_option_kwarg = {}
194+
if level_or_option_provided == 1:
195+
level_or_option_value = [v for v in [level_or_option, level, options]
196+
if v is not None][0]
197+
if zstd.__name__ == 'pyzstd':
198+
level_or_option_kwarg['level_or_option'] = level_or_option_value
199+
else:
200+
if isinstance(level_or_option_value, int):
201+
level_or_option_kwarg['level'] = level_or_option_value
202+
else:
203+
level_or_option_kwarg['options'] = level_or_option_value
204+
return zstd.ZstdFile(
205+
filename, mode, zstd_dict=zstd_dict, **level_or_option_kwarg)

nibabel/openers.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ class Opener:
6262

6363
gz_def = (gzip_open, ('mode', 'compresslevel', 'mtime', 'keep_open'))
6464
bz2_def = (BZ2File, ('mode', 'buffering', 'compresslevel'))
65-
zstd_def = (zstd_open, ('mode', 'level_or_option', 'zstd_dict'))
65+
zstd_def = (zstd_open, ('mode', 'level_or_option', 'zstd_dict', 'level',
66+
'option'))
6667
compress_ext_map: dict[str | None, OpenerDef] = {
6768
'.gz': gz_def,
6869
'.bz2': bz2_def,

0 commit comments

Comments
 (0)