Some more type hinting/safety.

This commit is contained in:
s3lph 2018-06-29 01:22:12 +02:00
parent 8898abc77b
commit ab9e470c35

View file

@ -43,7 +43,7 @@ class RequestArgument(object):
# Assign name # Assign name
self.__name: str = name self.__name: str = name
# Initialize value # Initialize value
self.__value: Union[Tuple[str, Union[bytes, str]], List[Tuple[str, Union[bytes, str]]]] = None self.__value: Union[Tuple[str, Union[bytes, str]], List[Tuple[str, Union[bytes, str]]]] = []
# Default to empty array # Default to empty array
if value is None: if value is None:
self.__value = [] self.__value = []
@ -98,6 +98,7 @@ class RequestArgument(object):
:raises IndexError: If the index is out of bounds. :raises IndexError: If the index is out of bounds.
:raises ValueError: If this is an array value, and no index is provided, or if this is a scalar value and an :raises ValueError: If this is an array value, and no index is provided, or if this is a scalar value and an
index is provided. index is provided.
:raises TypeError: If the requested value is neither a str nor a bytes object.
""" """
if self.is_array: if self.is_array:
# instance is an array value # instance is an array value
@ -123,6 +124,7 @@ class RequestArgument(object):
elif isinstance(self.__value[1], bytes): elif isinstance(self.__value[1], bytes):
# The value is a bytes object, attempt to decode # The value is a bytes object, attempt to decode
return self.__value[1].decode('utf-8') return self.__value[1].decode('utf-8')
raise TypeError('Value is neither a str nor bytes')
def get_bytes(self, index: int = None) -> bytes: def get_bytes(self, index: int = None) -> bytes:
""" """
@ -134,6 +136,7 @@ class RequestArgument(object):
:raises IndexError: If the index is out of bounds. :raises IndexError: If the index is out of bounds.
:raises ValueError: If this is an array value, and no index is provided, or if this is a scalar value and an :raises ValueError: If this is an array value, and no index is provided, or if this is a scalar value and an
index is provided. index is provided.
:raises TypeError: If the requested value is neither a str nor a bytes object.
""" """
if self.is_array: if self.is_array:
# instance is an array value # instance is an array value
@ -159,6 +162,7 @@ class RequestArgument(object):
elif isinstance(self.__value[1], str): elif isinstance(self.__value[1], str):
# The value is a string, encode first # The value is a string, encode first
return self.__value[1].encode('utf-8') return self.__value[1].encode('utf-8')
raise TypeError('Value is neither a str nor bytes')
def get_content_type(self, index: int = None) -> Optional[str]: def get_content_type(self, index: int = None) -> Optional[str]:
""" """
@ -177,16 +181,18 @@ class RequestArgument(object):
# Needs an index for array values # Needs an index for array values
raise ValueError('index must not be None') raise ValueError('index must not be None')
# Type hint; access array element # Type hint; access array element
v: Tuple[str, Union[bytes, str]] = self.__value[index] va: Tuple[str, Union[bytes, str]] = self.__value[index]
# Return the content type of the requested value # Return the content type of the requested value
return v[0] return va[0]
else: else:
# instance is a scalar value # instance is a scalar value
if index is not None: if index is not None:
# Must not have an index for array values # Must not have an index for array values
raise ValueError('index must be None') raise ValueError('index must be None')
# Type hint
vs: Tuple[str, Union[bytes, str]] = self.__value
# Return the content type of the scalar value # Return the content type of the scalar value
return self.__value[0] return vs[0]
def append(self, ctype: str, value: Union[str, bytes]): def append(self, ctype: str, value: Union[str, bytes]):
""" """
@ -227,8 +233,8 @@ class RequestArgument(object):
yield _View(self.__name, self.__value) yield _View(self.__name, self.__value)
else: else:
# Typing helper # Typing helper
_value: List[Tuple[str, Union[bytes, str]]] = self.__value vs: List[Tuple[str, Union[bytes, str]]] = self.__value
for v in _value: for v in vs:
# If this is an array, yield an immutable scalar view for each (ctype, value) element in the array # If this is an array, yield an immutable scalar view for each (ctype, value) element in the array
yield _View(self.__name, v) yield _View(self.__name, v)