125 self._gen = gen # generator or function returning generator |
125 self._gen = gen # generator or function returning generator |
126 self._values = values |
126 self._values = values |
127 self._makemap = makemap |
127 self._makemap = makemap |
128 self._joinfmt = joinfmt |
128 self._joinfmt = joinfmt |
129 self.keytype = keytype # hint for 'x in y' where type(x) is unresolved |
129 self.keytype = keytype # hint for 'x in y' where type(x) is unresolved |
|
130 |
|
131 def getmember(self, context, mapping, key): |
|
132 # TODO: maybe split hybrid list/dict types? |
|
133 if not util.safehasattr(self._values, 'get'): |
|
134 raise error.ParseError(_('not a dictionary')) |
|
135 return self._wrapvalue(key, self._values.get(key)) |
|
136 |
|
137 def _wrapvalue(self, key, val): |
|
138 if val is None: |
|
139 return |
|
140 return wraphybridvalue(self, key, val) |
130 |
141 |
131 def itermaps(self, context): |
142 def itermaps(self, context): |
132 makemap = self._makemap |
143 makemap = self._makemap |
133 for x in self._values: |
144 for x in self._values: |
134 yield makemap(x) |
145 yield makemap(x) |
665 d = evalwrapped(context, mapping, darg) |
676 d = evalwrapped(context, mapping, darg) |
666 if util.safehasattr(d, 'tomap'): |
677 if util.safehasattr(d, 'tomap'): |
667 lm = context.overlaymap(mapping, d.tomap()) |
678 lm = context.overlaymap(mapping, d.tomap()) |
668 return runsymbol(context, lm, memb) |
679 return runsymbol(context, lm, memb) |
669 try: |
680 try: |
670 if util.safehasattr(d, 'get'): |
681 if util.safehasattr(d, 'getmember'): |
671 return getdictitem(d, memb) |
682 return d.getmember(context, mapping, memb) |
672 raise error.ParseError |
683 raise error.ParseError |
673 except error.ParseError: |
684 except error.ParseError: |
674 sym = findsymbolicname(darg) |
685 sym = findsymbolicname(darg) |
675 if sym: |
686 if sym: |
676 raise error.ParseError(_("keyword '%s' has no member") % sym) |
687 raise error.ParseError(_("keyword '%s' has no member") % sym) |
691 try: |
702 try: |
692 return func(left, right) |
703 return func(left, right) |
693 except ZeroDivisionError: |
704 except ZeroDivisionError: |
694 raise error.Abort(_('division by zero is not defined')) |
705 raise error.Abort(_('division by zero is not defined')) |
695 |
706 |
696 def getdictitem(dictarg, key): |
|
697 val = dictarg.get(key) |
|
698 if val is None: |
|
699 return |
|
700 return wraphybridvalue(dictarg, key, val) |
|
701 |
|
702 def joinitems(itemiter, sep): |
707 def joinitems(itemiter, sep): |
703 """Join items with the separator; Returns generator of bytes""" |
708 """Join items with the separator; Returns generator of bytes""" |
704 first = True |
709 first = True |
705 for x in itemiter: |
710 for x in itemiter: |
706 if first: |
711 if first: |