Вот цитата из https://stackoverflow.com/users/893/greg-hewgill ответа на Объясните нотацию фрагментов Python .
Python добр к программистам, если их меньше, чем вы просите . Например, если вы запрашиваете [: - 2] и содержит только один элемент , вы получаете пустой список вместо ошибки. Иногда вы предпочитаете ошибку, поэтому вы должны знать, что это может произойти.
Итак, когда предпочтение отдается ошибке, как действовать с помощью Python? Есть ли более питонический способ переписать этот пример?
class ParseError(Exception):
pass
def safe_slice(data, start, end):
"""0 <= start <= end is assumed"""
r = data[start:end]
if len(r) != end - start:
raise IndexError
return r
def lazy_parse(data):
"""extract (name, phone) from a data buffer.
If the buffer could not be parsed, a ParseError is raised.
"""
try:
name_length = ord(data[0])
extracted_name = safe_slice(data, 1, 1 + name_length)
phone_length = ord(data[1 + name_length])
extracted_phone = safe_slice(data, 2 + name_length, 2 + name_length + phone_length)
except IndexError:
raise ParseError()
return extracted_name, extracted_phone
if __name__ == '__main__':
print lazy_parse("\x04Jack\x0A0123456789") # OK
print lazy_parse("\x04Jack\x0A012345678") # should raise ParseError
edit: пример было проще написать с использованием байтовых строк, но мой реальный код использует списки.