Питонический способ создания «безопасных по размеру» срезов

Вот цитата из 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: пример было проще написать с использованием байтовых строк, но мой реальный код использует списки.

7
задан Community 23 May 2017 в 11:55
поделиться