diff --git a/patsy/build.py b/patsy/build.py index cbe25248..4749e179 100644 --- a/patsy/build.py +++ b/patsy/build.py @@ -80,7 +80,8 @@ def _eval_factor(factor_info, data, NA_action): if not safe_issubdtype(np.asarray(result).dtype, np.number): raise PatsyError( "when evaluating numeric factor %s, " - "I got non-numeric data of type '%s'" % (factor.name(), result.dtype), + "I got non-numeric data of type '%s'" + % (factor.name(), np.asarray(result).dtype), factor, ) return result, NA_action.is_numerical_NA(result) diff --git a/patsy/eval.py b/patsy/eval.py index 9d1fba02..f878d05a 100644 --- a/patsy/eval.py +++ b/patsy/eval.py @@ -72,6 +72,20 @@ def get(self, key, default=None): except KeyError: return default + def __iter__(self): + seen = set() + for d in self._dicts: + for key in d: + if key not in seen: + seen.add(key) + yield key + + def __len__(self): + return len(list(iter(self))) + + def keys(self): + return list(iter(self)) + def __repr__(self): return "%s(%r)" % (self.__class__.__name__, self._dicts)