Skip to content

Commit 90bb94a

Browse files
committed
Refactor Python 3.7+ to use dict built-in instead of OrderedDict
OrderedDict is part of collections module for supported Python versions
1 parent 2a3dbfa commit 90bb94a

2 files changed

Lines changed: 56 additions & 28 deletions

File tree

netCDF4/_netCDF4.pyx

Lines changed: 54 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1233,14 +1233,10 @@ from cpython.bytes cimport PyBytes_FromStringAndSize
12331233
# pure python utilities
12341234
from .utils import (_StartCountStride, _quantize, _find_dim, _walk_grps,
12351235
_out_array_shape, _sortbylist, _tostr, _safecast, _is_int)
1236-
# try to use built-in ordered dict in python >= 2.7
1237-
try:
1236+
import sys
1237+
if sys.version_info[0:2] < (3, 7):
1238+
# Python 3.7+ guarantees order; older versions need OrderedDict
12381239
from collections import OrderedDict
1239-
except ImportError: # or else use drop-in substitute
1240-
try:
1241-
from ordereddict import OrderedDict
1242-
except ImportError:
1243-
raise ImportError('please install ordereddict (https://pypi.python.org/pypi/ordereddict)')
12441240
try:
12451241
from itertools import izip as zip
12461242
except ImportError:
@@ -1254,7 +1250,6 @@ import posixpath
12541250
from cftime import num2date, date2num, date2index
12551251
import numpy
12561252
import weakref
1257-
import sys
12581253
import warnings
12591254
from glob import glob
12601255
from numpy import ma
@@ -1677,9 +1672,15 @@ cdef _get_types(group):
16771672
ierr = nc_inq_typeids(_grpid, &ntypes, typeids)
16781673
_ensure_nc_success(ierr)
16791674
# create empty dictionary for CompoundType instances.
1680-
cmptypes = OrderedDict()
1681-
vltypes = OrderedDict()
1682-
enumtypes = OrderedDict()
1675+
if sys.version_info[0:2] < (3, 7):
1676+
cmptypes = OrderedDict()
1677+
vltypes = OrderedDict()
1678+
enumtypes = OrderedDict()
1679+
else:
1680+
cmptypes = dict()
1681+
vltypes = dict()
1682+
enumtypes = dict()
1683+
16831684
if ntypes > 0:
16841685
for n from 0 <= n < ntypes:
16851686
xtype = typeids[n]
@@ -1735,7 +1736,10 @@ cdef _get_dims(group):
17351736
ierr = nc_inq_ndims(_grpid, &numdims)
17361737
_ensure_nc_success(ierr)
17371738
# create empty dictionary for dimensions.
1738-
dimensions = OrderedDict()
1739+
if sys.version_info[0:2] < (3, 7):
1740+
dimensions = OrderedDict()
1741+
else:
1742+
dimensions = dict()
17391743
if numdims > 0:
17401744
dimids = <int *>malloc(sizeof(int) * numdims)
17411745
if group.data_model == 'NETCDF4':
@@ -1766,7 +1770,10 @@ cdef _get_grps(group):
17661770
ierr = nc_inq_grps(_grpid, &numgrps, NULL)
17671771
_ensure_nc_success(ierr)
17681772
# create dictionary containing `netCDF4.Group` instances for groups in this group
1769-
groups = OrderedDict()
1773+
if sys.version_info[0:2] < (3, 7):
1774+
groups = OrderedDict()
1775+
else:
1776+
groups = dict()
17701777
if numgrps > 0:
17711778
grpids = <int *>malloc(sizeof(int) * numgrps)
17721779
with nogil:
@@ -1796,7 +1803,10 @@ cdef _get_vars(group):
17961803
ierr = nc_inq_nvars(_grpid, &numvars)
17971804
_ensure_nc_success(ierr, err_cls=AttributeError)
17981805
# create empty dictionary for variables.
1799-
variables = OrderedDict()
1806+
if sys.version_info[0:2] < (3, 7):
1807+
variables = OrderedDict()
1808+
else:
1809+
variables = dict()
18001810
if numvars > 0:
18011811
# get variable ids.
18021812
varids = <int *>malloc(sizeof(int) * numvars)
@@ -2373,7 +2383,10 @@ strings.
23732383
if self.data_model == 'NETCDF4':
23742384
self.groups = _get_grps(self)
23752385
else:
2376-
self.groups = OrderedDict()
2386+
if sys.version_info[0:2] < (3, 7):
2387+
self.groups = OrderedDict()
2388+
else:
2389+
self.groups = dict()
23772390

23782391
# these allow Dataset objects to be used via a "with" statement.
23792392
def __enter__(self):
@@ -2954,7 +2967,11 @@ attributes."""
29542967
values = []
29552968
for name in names:
29562969
values.append(_get_att(self, NC_GLOBAL, name))
2957-
return OrderedDict(zip(names,values))
2970+
gen = zip(names, values)
2971+
if sys.version_info[0:2] < (3, 7):
2972+
return OrderedDict(gen)
2973+
else:
2974+
return dict(gen)
29582975
else:
29592976
raise AttributeError
29602977
elif name in _private_atts:
@@ -3280,12 +3297,21 @@ Additional read-only class variables:
32803297
bytestr = _strencode(name)
32813298
groupname = bytestr
32823299
_ensure_nc_success(nc_def_grp(parent._grpid, groupname, &self._grpid))
3283-
self.cmptypes = OrderedDict()
3284-
self.vltypes = OrderedDict()
3285-
self.enumtypes = OrderedDict()
3286-
self.dimensions = OrderedDict()
3287-
self.variables = OrderedDict()
3288-
self.groups = OrderedDict()
3300+
if sys.version_info[0:2] < (3, 7):
3301+
self.cmptypes = OrderedDict()
3302+
self.vltypes = OrderedDict()
3303+
self.enumtypes = OrderedDict()
3304+
self.dimensions = OrderedDict()
3305+
self.variables = OrderedDict()
3306+
self.groups = OrderedDict()
3307+
else:
3308+
self.cmptypes = dict()
3309+
self.vltypes = dict()
3310+
self.enumtypes = dict()
3311+
self.dimensions = dict()
3312+
self.variables = dict()
3313+
self.groups = dict()
3314+
32893315

32903316
def close(self):
32913317
"""
@@ -4351,7 +4377,12 @@ details."""
43514377
values = []
43524378
for name in names:
43534379
values.append(_get_att(self._grp, self._varid, name))
4354-
return OrderedDict(zip(names,values))
4380+
gen = zip(names, values)
4381+
if sys.version_info[0:2] < (3, 7):
4382+
return OrderedDict(gen)
4383+
else:
4384+
return dict(gen)
4385+
43554386
else:
43564387
raise AttributeError
43574388
elif name in _private_atts:

test/tst_atts.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,10 @@
77
import warnings
88

99
import numpy as NP
10+
from collections import OrderedDict
1011
from numpy.random.mtrand import uniform
11-
import netCDF4
1212

13-
try:
14-
from collections import OrderedDict
15-
except ImportError: # or else use drop-in substitute
16-
from ordereddict import OrderedDict
13+
import netCDF4
1714

1815
# test attribute creation.
1916
FILE_NAME = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name

0 commit comments

Comments
 (0)