aboutsummaryrefslogtreecommitdiff
path: root/pyasn1/type
diff options
context:
space:
mode:
authorIlya Etingof <etingof@gmail.com>2017-09-18 09:48:29 +0200
committerIlya Etingof <etingof@gmail.com>2017-09-19 20:37:38 +0200
commitfc87382dd490810c6a4ba2cf803703b7f557dee2 (patch)
tree7691b2060fc8e411343d5d2e698f9ac390261783 /pyasn1/type
parentd6c09ffbb51518669c0889ff1081888aebfcb16e (diff)
downloadpyasn1-fc87382dd490810c6a4ba2cf803703b7f557dee2.tar.gz
Set/Sequence & SetOf/SequenceOf subscription to raise Key/IndexError (#73)
Diffstat (limited to 'pyasn1/type')
-rw-r--r--pyasn1/type/base.py6
-rw-r--r--pyasn1/type/univ.py52
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: