diff options
author | Ilya Etingof <etingof@gmail.com> | 2017-09-18 09:48:29 +0200 |
---|---|---|
committer | Ilya Etingof <etingof@gmail.com> | 2017-09-19 20:37:38 +0200 |
commit | fc87382dd490810c6a4ba2cf803703b7f557dee2 (patch) | |
tree | 7691b2060fc8e411343d5d2e698f9ac390261783 /pyasn1/type | |
parent | d6c09ffbb51518669c0889ff1081888aebfcb16e (diff) | |
download | pyasn1-fc87382dd490810c6a4ba2cf803703b7f557dee2.tar.gz |
Set/Sequence & SetOf/SequenceOf subscription to raise Key/IndexError (#73)
Diffstat (limited to 'pyasn1/type')
-rw-r--r-- | pyasn1/type/base.py | 6 | ||||
-rw-r--r-- | pyasn1/type/univ.py | 52 |
2 files changed, 46 insertions, 12 deletions
diff --git a/pyasn1/type/base.py b/pyasn1/type/base.py index a76ae9c..1b54d8d 100644 --- a/pyasn1/type/base.py +++ b/pyasn1/type/base.py @@ -586,12 +586,6 @@ class AbstractConstructedAsn1Item(Asn1ItemBase): self[k] = kwargs[k] return self - def __getitem__(self, idx): - return self.getComponentByPosition(idx) - - def __setitem__(self, idx, value): - self.setComponentByPosition(idx, value) - def __len__(self): return len(self._componentValues) diff --git a/pyasn1/type/univ.py b/pyasn1/type/univ.py index 3db6ab9..8d93226 100644 --- a/pyasn1/type/univ.py +++ b/pyasn1/type/univ.py @@ -1729,6 +1729,20 @@ class SequenceOfAndSetOfBase(base.AbstractConstructedAsn1Item): # Python list protocol + def __getitem__(self, idx): + try: + return self.getComponentByPosition(idx) + + except error.PyAsn1Error: + raise IndexError(sys.exc_info()[1]) + + def __setitem__(self, idx, value): + try: + self.setComponentByPosition(idx, value) + + except error.PyAsn1Error: + raise IndexError(sys.exc_info()[1]) + def clear(self): self._componentValues = [] @@ -1745,7 +1759,11 @@ class SequenceOfAndSetOfBase(base.AbstractConstructedAsn1Item): def index(self, value, start=0, stop=None): if stop is None: stop = len(self) - return self._componentValues.index(value, start, stop) + try: + return self._componentValues.index(value, start, stop) + + except error.PyAsn1Error: + raise ValueError(sys.exc_info()[1]) def reverse(self): self._componentValues.reverse() @@ -2062,15 +2080,37 @@ class SequenceAndSetBase(base.AbstractConstructedAsn1Item): def __getitem__(self, idx): if octets.isStringType(idx): - return self.getComponentByName(idx) + try: + return self.getComponentByName(idx) + + except error.PyAsn1Error: + # duck-typing dict + raise KeyError(sys.exc_info()[1]) + else: - return base.AbstractConstructedAsn1Item.__getitem__(self, idx) + try: + return self.getComponentByPosition(idx) + + except error.PyAsn1Error: + # duck-typing list + raise IndexError(sys.exc_info()[1]) def __setitem__(self, idx, value): if octets.isStringType(idx): - self.setComponentByName(idx, value) + try: + self.setComponentByName(idx, value) + + except error.PyAsn1Error: + # duck-typing dict + raise KeyError(sys.exc_info()[1]) + else: - base.AbstractConstructedAsn1Item.__setitem__(self, idx, value) + try: + self.setComponentByPosition(idx, value) + + except error.PyAsn1Error: + # duck-typing list + raise IndexError(sys.exc_info()[1]) def __contains__(self, key): if self._componentTypeLen: @@ -2258,7 +2298,7 @@ class SequenceAndSetBase(base.AbstractConstructedAsn1Item): currentValue = noValue if componentTypeLen: if componentTypeLen < idx: - raise IndexError('component index out of range') + raise error.PyAsn1Error('component index out of range') self._componentValues = [noValue] * componentTypeLen if value is noValue: |