Browse Source

generators and iterables no longer get expanded in lists.

main
Bill Ladwig 9 years ago
parent
commit
101895d3f4
  1. 1634
      wrf_open/var/ncl_reference/WRFUserARW.ncl
  2. 2
      wrf_open/var/src/python/wrf/var/interp.py
  3. 4
      wrf_open/var/src/python/wrf/var/routines.py
  4. 72
      wrf_open/var/src/python/wrf/var/util.py

1634
wrf_open/var/ncl_reference/WRFUserARW.ncl

File diff suppressed because it is too large Load Diff

2
wrf_open/var/src/python/wrf/var/interp.py

@ -94,7 +94,7 @@ def interpline(field2d, pivot_point=None,
@set_interp_metadata("vinterp") @set_interp_metadata("vinterp")
def vinterp(wrfnc, field, vert_coord, interp_levels, extrapolate=False, def vinterp(wrfnc, field, vert_coord, interp_levels, extrapolate=False,
field_type=None, log_p=False, timeidx=-1, method="cat", field_type=None, log_p=False, timeidx=0, method="cat",
squeeze=True, cache=None, meta=True): squeeze=True, cache=None, meta=True):
# Remove case sensitivity # Remove case sensitivity
field_type = field_type.lower() if field_type is not None else "none" field_type = field_type.lower() if field_type is not None else "none"

4
wrf_open/var/src/python/wrf/var/routines.py

@ -1,6 +1,6 @@
from .util import _unpack_sequence, is_standard_wrf_var, extract_vars from .util import _get_iterable, is_standard_wrf_var, extract_vars
from .cape import get_2dcape, get_3dcape from .cape import get_2dcape, get_3dcape
from .ctt import get_ctt from .ctt import get_ctt
from .dbz import get_dbz, get_max_dbz from .dbz import get_dbz, get_max_dbz
@ -153,7 +153,7 @@ def getvar(wrfnc, var, timeidx=0,
method="cat", squeeze=True, cache=None, meta=True, method="cat", squeeze=True, cache=None, meta=True,
**kargs): **kargs):
wrfnc = _unpack_sequence(wrfnc) wrfnc = _get_iterable(wrfnc)
if is_standard_wrf_var(wrfnc, var): if is_standard_wrf_var(wrfnc, var):
return extract_vars(wrfnc, timeidx, var, return extract_vars(wrfnc, timeidx, var,

72
wrf_open/var/src/python/wrf/var/util.py

@ -1,9 +1,11 @@
from __future__ import (absolute_import, division, print_function, from __future__ import (absolute_import, division, print_function,
unicode_literals) unicode_literals)
from copy import copy
from collections import Iterable, Mapping, OrderedDict from collections import Iterable, Mapping, OrderedDict
from itertools import product from itertools import product
from inspect import getargspec from inspect import getargspec, getargvalues, getmodule
from types import GeneratorType
import datetime as dt import datetime as dt
import numpy as np import numpy as np
@ -58,23 +60,71 @@ def _is_multi_file(wrfnc):
def _is_mapping(wrfnc): def _is_mapping(wrfnc):
return isinstance(wrfnc, Mapping) return isinstance(wrfnc, Mapping)
def _unpack_sequence(wrfseq): def _generator_copy(gen):
"""Unpacks generators in to lists or dictionaries if applicable, otherwise funcname = gen.__name__
returns the original object. argvals = getargvalues(gen.gi_frame)
module = getmodule(gen.gi_frame)
This is apparently the easiest and if module is not None:
fastest way of being able to re-iterate through generators when used res = module.get(funcname)(**argvals.locals)
more than once. else:
# Created in jupyter or the python interpreter
import __main__
res = getattr(__main__, funcname)(**argvals.locals)
""" return res
def test():
q = [1,2,3]
for i in q:
yield i
class TestGen(object):
def __init__(self, count=3):
self._total = count
self._i = 0
def __iter__(self):
return self
def next(self):
if self._i >= self._total:
raise StopIteration
else:
val = self._i
self._i += 1
return val
# Python 3
def __next__(self):
return self.next()
class IterWrapper(Iterable):
"""A wrapper class for generators and custom iterable classes which returns
a new iterator from the start of the sequence when __iter__ is called"""
def __init__(self, wrapped):
self._wrapped = wrapped
def __iter__(self):
if isinstance(self._wrapped, GeneratorType):
return _generator_copy(self._wrapped)
else:
obj_copy = copy(self._wrapped)
return obj_copy.__iter__()
def _get_iterable(wrfseq):
"""Returns a resetable iterable object."""
if not _is_multi_file(wrfseq): if not _is_multi_file(wrfseq):
return wrfseq return wrfseq
else: else:
if not _is_mapping(wrfseq): if not _is_mapping(wrfseq):
if isinstance(wrfseq, (list, tuple)):
if isinstance(wrfseq, (list, tuple, IterWrapper)):
return wrfseq return wrfseq
else: else:
return list(wrfseq) # generator/custom iterable class return IterWrapper(wrfseq) # generator/custom iterable class
else: else:
if isinstance(wrfseq, dict): if isinstance(wrfseq, dict):
return wrfseq return wrfseq
@ -498,7 +548,7 @@ def combine_files(wrfseq, varname, timeidx, is_moving=None,
method="cat", squeeze=True, meta=True): method="cat", squeeze=True, meta=True):
# Handles generators, single files, lists, tuples, custom classes # Handles generators, single files, lists, tuples, custom classes
wrfseq = _unpack_sequence(wrfseq) wrfseq = _get_iterable(wrfseq)
# Dictionary is unique # Dictionary is unique
if _is_mapping(wrfseq): if _is_mapping(wrfseq):

Loading…
Cancel
Save