3
3
import functools
4
4
import operator
5
5
import os
6
+ from collections .abc import Iterable
6
7
from contextlib import suppress
8
+ from typing import TYPE_CHECKING , Any
7
9
8
10
import numpy as np
9
11
33
35
FrozenDict ,
34
36
close_on_error ,
35
37
is_remote_uri ,
36
- module_available ,
37
38
try_read_magic_number_from_path ,
38
39
)
39
40
from xarray .core .variable import Variable
40
41
42
+ if TYPE_CHECKING :
43
+ from io import BufferedIOBase
44
+
45
+ from xarray .backends .common import AbstractDataStore
46
+ from xarray .core .dataset import Dataset
47
+
41
48
# This lookup table maps from dtype.byteorder to a readable endian
42
49
# string used by netCDF4.
43
50
_endian_lookup = {"=" : "native" , ">" : "big" , "<" : "little" , "|" : "native" }
@@ -535,33 +542,37 @@ class NetCDF4BackendEntrypoint(BackendEntrypoint):
535
542
backends.ScipyBackendEntrypoint
536
543
"""
537
544
538
- available = module_available ("netCDF4" )
539
545
description = (
540
546
"Open netCDF (.nc, .nc4 and .cdf) and most HDF5 files using netCDF4 in Xarray"
541
547
)
542
548
url = "https://docs.xarray.dev/en/stable/generated/xarray.backends.NetCDF4BackendEntrypoint.html"
543
549
544
- def guess_can_open (self , filename_or_obj ):
550
+ def guess_can_open (
551
+ self ,
552
+ filename_or_obj : str | os .PathLike [Any ] | BufferedIOBase | AbstractDataStore ,
553
+ ) -> bool :
545
554
if isinstance (filename_or_obj , str ) and is_remote_uri (filename_or_obj ):
546
555
return True
547
556
magic_number = try_read_magic_number_from_path (filename_or_obj )
548
557
if magic_number is not None :
549
558
# netcdf 3 or HDF5
550
559
return magic_number .startswith ((b"CDF" , b"\211 HDF\r \n \032 \n " ))
551
- try :
560
+
561
+ if isinstance (filename_or_obj , (str , os .PathLike )):
552
562
_ , ext = os .path .splitext (filename_or_obj )
553
- except TypeError :
554
- return False
555
- return ext in { ".nc" , ".nc4" , ".cdf" }
563
+ return ext in { ".nc" , ".nc4" , ".cdf" }
564
+
565
+ return False
556
566
557
- def open_dataset (
567
+ def open_dataset ( # type: ignore[override] # allow LSP violation, not supporting **kwargs
558
568
self ,
559
- filename_or_obj ,
569
+ filename_or_obj : str | os .PathLike [Any ] | BufferedIOBase | AbstractDataStore ,
570
+ * ,
560
571
mask_and_scale = True ,
561
572
decode_times = True ,
562
573
concat_characters = True ,
563
574
decode_coords = True ,
564
- drop_variables = None ,
575
+ drop_variables : str | Iterable [ str ] | None = None ,
565
576
use_cftime = None ,
566
577
decode_timedelta = None ,
567
578
group = None ,
@@ -572,7 +583,7 @@ def open_dataset(
572
583
persist = False ,
573
584
lock = None ,
574
585
autoclose = False ,
575
- ):
586
+ ) -> Dataset :
576
587
filename_or_obj = _normalize_path (filename_or_obj )
577
588
store = NetCDF4DataStore .open (
578
589
filename_or_obj ,
@@ -601,4 +612,4 @@ def open_dataset(
601
612
return ds
602
613
603
614
604
- BACKEND_ENTRYPOINTS ["netcdf4" ] = NetCDF4BackendEntrypoint
615
+ BACKEND_ENTRYPOINTS ["netcdf4" ] = ( "netCDF4" , NetCDF4BackendEntrypoint )
0 commit comments