Skip to content

Commit 7750c00

Browse files
authored
Repo review bugbear (#9505)
* Use ignore instead of extend-ignore for ruff * Fix B028 no explicit stacklevel in warnings.warn * Fix B006, B007 and B011 (auto-fixes) * B006: mutable argument default * B007: unused loop control variable * B011: assert false * Fix the remaining B006 and B007 manually * Fix B015: pointless comparisons * Fix B017: pytest.raises(Exception) * Fix B023: function definition does not bind loop variable * Fix B005: strip with multicharacter strings * Fix B020: loop control variable overrides iterable * Fix B008: no function call in argument defaults * Fix B018: useless expression * Fix B904: raise from within except * Finally enable ruff bugbear lints * Fix readthedocs
1 parent a74ddf7 commit 7750c00

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+234
-172
lines changed

asv_bench/benchmarks/__init__.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@ def decorator(func):
1818
def requires_dask():
1919
try:
2020
import dask # noqa: F401
21-
except ImportError:
22-
raise NotImplementedError()
21+
except ImportError as err:
22+
raise NotImplementedError() from err
2323

2424

2525
def requires_sparse():
2626
try:
2727
import sparse # noqa: F401
28-
except ImportError:
29-
raise NotImplementedError()
28+
except ImportError as err:
29+
raise NotImplementedError() from err
3030

3131

3232
def randn(shape, frac_nan=None, chunks=None, seed=0):

asv_bench/benchmarks/accessors.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ def setup(self, calendar):
1616
self.da = xr.DataArray(data, dims="time", coords={"time": time})
1717

1818
def time_dayofyear(self, calendar):
19-
self.da.time.dt.dayofyear
19+
_ = self.da.time.dt.dayofyear
2020

2121
def time_year(self, calendar):
22-
self.da.time.dt.year
22+
_ = self.da.time.dt.year
2323

2424
def time_floor(self, calendar):
25-
self.da.time.dt.floor("D")
25+
_ = self.da.time.dt.floor("D")

asv_bench/benchmarks/dataset_io.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -606,8 +606,8 @@ def setup(self):
606606

607607
try:
608608
import distributed
609-
except ImportError:
610-
raise NotImplementedError()
609+
except ImportError as err:
610+
raise NotImplementedError() from err
611611

612612
self.client = distributed.Client()
613613
self.write = create_delayed_write()

ci/min_deps_check.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ def parse_requirements(fname) -> Iterator[tuple[str, int, int, int | None]]:
6868

6969
try:
7070
version_tup = tuple(int(x) for x in version.split("."))
71-
except ValueError:
72-
raise ValueError("non-numerical version: " + row)
71+
except ValueError as err:
72+
raise ValueError("non-numerical version: " + row) from err
7373

7474
if len(version_tup) == 2:
7575
yield (pkg, *version_tup, None) # type: ignore[misc]

doc/user-guide/hierarchical-data.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ and even the distinguishing feature of the common ancestor of any two species (t
200200

201201
.. ipython:: python
202202
203-
[node.name for node in primates.ancestors]
203+
[node.name for node in reversed(primates.parents)]
204204
primates.root.name
205205
primates.find_common_ancestor(dinosaurs).name
206206

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,13 +246,14 @@ extend-exclude = [
246246
extend-safe-fixes = [
247247
"TID252", # absolute imports
248248
]
249-
extend-ignore = [
249+
ignore = [
250250
"E402",
251251
"E501",
252252
"E731",
253253
"UP007",
254254
]
255255
extend-select = [
256+
"B", # flake8-bugbear
256257
"F", # Pyflakes
257258
"E", # Pycodestyle
258259
"W",

xarray/backends/api.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,11 @@ def _get_default_engine_remote_uri() -> Literal["netcdf4", "pydap"]:
9999
import pydap # noqa: F401
100100

101101
engine = "pydap"
102-
except ImportError:
102+
except ImportError as err:
103103
raise ValueError(
104104
"netCDF4 or pydap is required for accessing "
105105
"remote datasets via OPeNDAP"
106-
)
106+
) from err
107107
return engine
108108

109109

@@ -112,8 +112,8 @@ def _get_default_engine_gz() -> Literal["scipy"]:
112112
import scipy # noqa: F401
113113

114114
engine: Final = "scipy"
115-
except ImportError: # pragma: no cover
116-
raise ValueError("scipy is required for accessing .gz files")
115+
except ImportError as err: # pragma: no cover
116+
raise ValueError("scipy is required for accessing .gz files") from err
117117
return engine
118118

119119

@@ -128,11 +128,11 @@ def _get_default_engine_netcdf() -> Literal["netcdf4", "scipy"]:
128128
import scipy.io.netcdf # noqa: F401
129129

130130
engine = "scipy"
131-
except ImportError:
131+
except ImportError as err:
132132
raise ValueError(
133133
"cannot read or write netCDF files without "
134134
"netCDF4-python or scipy installed"
135-
)
135+
) from err
136136
return engine
137137

138138

@@ -1374,8 +1374,8 @@ def to_netcdf(
13741374

13751375
try:
13761376
store_open = WRITEABLE_STORES[engine]
1377-
except KeyError:
1378-
raise ValueError(f"unrecognized engine for to_netcdf: {engine!r}")
1377+
except KeyError as err:
1378+
raise ValueError(f"unrecognized engine for to_netcdf: {engine!r}") from err
13791379

13801380
if format is not None:
13811381
format = format.upper() # type: ignore[assignment]

xarray/backends/netCDF4_.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ def _getitem(self, key):
111111
with self.datastore.lock:
112112
original_array = self.get_array(needs_lock=False)
113113
array = getitem(original_array, key)
114-
except IndexError:
114+
except IndexError as err:
115115
# Catch IndexError in netCDF4 and return a more informative
116116
# error message. This is most often called when an unsorted
117117
# indexer is used before the data is loaded from disk.
@@ -120,7 +120,7 @@ def _getitem(self, key):
120120
"is not valid on netCDF4.Variable object. Try loading "
121121
"your data into memory first by calling .load()."
122122
)
123-
raise IndexError(msg)
123+
raise IndexError(msg) from err
124124
return array
125125

126126

@@ -192,7 +192,7 @@ def _nc4_require_group(ds, group, mode, create_group=_netcdf4_create_group):
192192
ds = create_group(ds, key)
193193
else:
194194
# wrap error to provide slightly more helpful message
195-
raise OSError(f"group not found: {key}", e)
195+
raise OSError(f"group not found: {key}", e) from e
196196
return ds
197197

198198

xarray/backends/plugins.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ def remove_duplicates(entrypoints: EntryPoints) -> list[EntryPoint]:
4040
f"\n {all_module_names}.\n "
4141
f"The entrypoint {selected_module_name} will be used.",
4242
RuntimeWarning,
43+
stacklevel=2,
4344
)
4445
return unique_entrypoints
4546

@@ -72,7 +73,9 @@ def backends_dict_from_pkg(
7273
backend = entrypoint.load()
7374
backend_entrypoints[name] = backend
7475
except Exception as ex:
75-
warnings.warn(f"Engine {name!r} loading failed:\n{ex}", RuntimeWarning)
76+
warnings.warn(
77+
f"Engine {name!r} loading failed:\n{ex}", RuntimeWarning, stacklevel=2
78+
)
7679
return backend_entrypoints
7780

7881

@@ -146,7 +149,9 @@ def guess_engine(
146149
except PermissionError:
147150
raise
148151
except Exception:
149-
warnings.warn(f"{engine!r} fails while guessing", RuntimeWarning)
152+
warnings.warn(
153+
f"{engine!r} fails while guessing", RuntimeWarning, stacklevel=2
154+
)
150155

151156
compatible_engines = []
152157
for engine, (_, backend_cls) in BACKEND_ENTRYPOINTS.items():
@@ -155,7 +160,9 @@ def guess_engine(
155160
if backend.guess_can_open(store_spec):
156161
compatible_engines.append(engine)
157162
except Exception:
158-
warnings.warn(f"{engine!r} fails while guessing", RuntimeWarning)
163+
warnings.warn(
164+
f"{engine!r} fails while guessing", RuntimeWarning, stacklevel=2
165+
)
159166

160167
installed_engines = [k for k in engines if k != "store"]
161168
if not compatible_engines:

xarray/backends/scipy_.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,9 @@ def _open_scipy_netcdf(filename, mode, mmap, version):
114114
# TODO: gzipped loading only works with NetCDF3 files.
115115
errmsg = e.args[0]
116116
if "is not a valid NetCDF 3 file" in errmsg:
117-
raise ValueError("gzipped file loading only supports NetCDF 3 files.")
117+
raise ValueError(
118+
"gzipped file loading only supports NetCDF 3 files."
119+
) from e
118120
else:
119121
raise
120122

@@ -134,7 +136,7 @@ def _open_scipy_netcdf(filename, mode, mmap, version):
134136
$ pip install netcdf4
135137
"""
136138
errmsg += msg
137-
raise TypeError(errmsg)
139+
raise TypeError(errmsg) from e
138140
else:
139141
raise
140142

0 commit comments

Comments
 (0)