88
99from .common import BACKEND_ENTRYPOINTS
1010
11+ STANDARD_BACKENDS_ORDER = ["netcdf4" , "h5netcdf" , "scipy" ]
1112
12- def remove_duplicates (backend_entrypoints ):
13+
14+ def remove_duplicates (pkg_entrypoints ):
1315
1416 # sort and group entrypoints by name
15- backend_entrypoints = sorted (backend_entrypoints , key = lambda ep : ep .name )
16- backend_entrypoints_grouped = itertools .groupby (
17- backend_entrypoints , key = lambda ep : ep .name
18- )
17+ pkg_entrypoints = sorted (pkg_entrypoints , key = lambda ep : ep .name )
18+ pkg_entrypoints_grouped = itertools .groupby (pkg_entrypoints , key = lambda ep : ep .name )
1919 # check if there are multiple entrypoints for the same name
20- unique_backend_entrypoints = []
21- for name , matches in backend_entrypoints_grouped :
20+ unique_pkg_entrypoints = []
21+ for name , matches in pkg_entrypoints_grouped :
2222 matches = list (matches )
23- unique_backend_entrypoints .append (matches [0 ])
23+ unique_pkg_entrypoints .append (matches [0 ])
2424 matches_len = len (matches )
2525 if matches_len > 1 :
2626 selected_module_name = matches [0 ].module_name
@@ -30,7 +30,7 @@ def remove_duplicates(backend_entrypoints):
3030 f"\n { all_module_names } .\n It will be used: { selected_module_name } ." ,
3131 RuntimeWarning ,
3232 )
33- return unique_backend_entrypoints
33+ return unique_pkg_entrypoints
3434
3535
3636def detect_parameters (open_dataset ):
@@ -51,13 +51,13 @@ def detect_parameters(open_dataset):
5151 return tuple (parameters_list )
5252
5353
54- def create_engines_dict ( backend_entrypoints ):
55- engines = {}
56- for backend_ep in backend_entrypoints :
57- name = backend_ep .name
58- backend = backend_ep .load ()
59- engines [name ] = backend
60- return engines
54+ def backends_dict_from_pkg ( pkg_entrypoints ):
55+ backend_entrypoints = {}
56+ for pkg_ep in pkg_entrypoints :
57+ name = pkg_ep .name
58+ backend = pkg_ep .load ()
59+ backend_entrypoints [name ] = backend
60+ return backend_entrypoints
6161
6262
6363def set_missing_parameters (backend_entrypoints ):
@@ -67,11 +67,23 @@ def set_missing_parameters(backend_entrypoints):
6767 backend .open_dataset_parameters = detect_parameters (open_dataset )
6868
6969
70- def build_engines (entrypoints ):
70+ def sort_backends (backend_entrypoints ):
71+ ordered_backends_entrypoints = {}
72+ for be_name in STANDARD_BACKENDS_ORDER :
73+ if backend_entrypoints .get (be_name , None ) is not None :
74+ ordered_backends_entrypoints [be_name ] = backend_entrypoints .pop (be_name )
75+ ordered_backends_entrypoints .update (
76+ {name : backend_entrypoints [name ] for name in sorted (backend_entrypoints )}
77+ )
78+ return ordered_backends_entrypoints
79+
80+
81+ def build_engines (pkg_entrypoints ):
7182 backend_entrypoints = BACKEND_ENTRYPOINTS .copy ()
72- pkg_entrypoints = remove_duplicates (entrypoints )
73- external_backend_entrypoints = create_engines_dict (pkg_entrypoints )
83+ pkg_entrypoints = remove_duplicates (pkg_entrypoints )
84+ external_backend_entrypoints = backends_dict_from_pkg (pkg_entrypoints )
7485 backend_entrypoints .update (external_backend_entrypoints )
86+ backend_entrypoints = sort_backends (backend_entrypoints )
7587 set_missing_parameters (backend_entrypoints )
7688 engines = {}
7789 for name , backend in backend_entrypoints .items ():
@@ -81,8 +93,8 @@ def build_engines(entrypoints):
8193
8294@functools .lru_cache (maxsize = 1 )
8395def list_engines ():
84- entrypoints = pkg_resources .iter_entry_points ("xarray.backends" )
85- return build_engines (entrypoints )
96+ pkg_entrypoints = pkg_resources .iter_entry_points ("xarray.backends" )
97+ return build_engines (pkg_entrypoints )
8698
8799
88100def guess_engine (store_spec ):
0 commit comments