Написание небольшого фрагмента кода для суммирования цифр в строке с использованием блока try-except

Предыстория: В одном из «упражнений для пальцев» в моем вводном учебнике я попытался написать такую ​​программу, чтобы научить меня использовать блок try-except. Учебник предназначен для сопровождения курса «6.00x» на edX, MOOC MIT. Это не часть самого онлайн-класса, а просто некоторая практика, чтобы я понял блоки try-excpet.

Вот мой код:

def sumDigits(s):
'''Assumes s is a string
   Returns the sum of the decimal digits in s
       For example, if is is 'a2b3c' it returns 5'''
    try:
        digitsum = 0
        for i in s:
            digitsum += int(i)


    except TypeError:
        return 'You have hit a TypeError'

    except ValueError:
        return 'You have hit a ValueError'

    return digitsum

Итак, у меня возникли проблемы с тем, чтобы не знать, что добавить в предложение исключения. Текст, который я поместил в два предложения исключения, существует потому, что я просто хотел, чтобы моя программа работала. Я предполагаю, что интерпретатор проходит через строку типа «456ab», нажимает «a», затем распечатывает текст, который я сказал ему вернуть, когда он неизбежно попадает в ValueError. Как мне заставить его «игнорировать» буквенные символы в строке и просто использовать числа в строке, и все это в контексте блока try-except?


person Javier Arcenas    schedule 03.12.2013    source источник
comment
В качестве альтернативы вы можете отфильтровать нецифровые символы, используя "".join(filter(str.isdigit, "dfg")).   -  person Ramchandra Apte    schedule 03.12.2013


Ответы (1)


Переместите try в цикл и игнорируйте исключение, используя pass в качестве обработчика исключений:

digitsum = 0
for i in s:
    try:
        digitsum += int(i)
    except ValueError:
        pass  # ignore non-digit characters

Вы не нажмете TypeError здесь, если только какой-либо i не является типом объекта, который int() не может обработать; например ничего, кроме числа или строки:

>>> int({})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: int() argument must be a string or a number, not 'dict'
person Martijn Pieters    schedule 03.12.2013
comment
Этот метод получает точную сумму, игнорируя символы, которые не суммируются. Однако игнорирование исключений в целом является ПЛОХОЙ ПРАКТИКОЙ. Часть цели исключений состоит в том, чтобы задохнуться от неожиданного ввода, и простое игнорирование или использование исключения является распространенным источником трудно обнаруживаемых ошибок. Я не думаю, что целью исходного упражнения было использование исключений таким образом. - person mcgyver5; 03.12.2013
comment
@mcgyver5: Почему игнорирование исключений для определенных приложений может быть плохой практикой? Исключения Python — это не просто ошибки; они являются сигналами, чтобы сообщить вам об исключительных ситуациях. В некоторых случаях явное игнорирование таких ситуаций нормально. - person Martijn Pieters; 03.12.2013
comment
@mcgyver5: Вот почему здесь перехватывается исключение в одиночном методе. Это полностью Pythonic, особенно когда OP пытается узнать, как их использовать! - person Martijn Pieters; 03.12.2013
comment
@mcgyver5: Кстати, не сравнивайте использование исключений Python с другими языками. Опять же, позвольте мне подчеркнуть, что исключения существуют не только для того, чтобы сигнализировать об ошибках в коде. - person Martijn Pieters; 03.12.2013
comment
@mcgyver5: Чтобы проиллюстрировать: исключения Python StopIteration и GeneratorExit используются исключительно для обозначения определенных сигналов, которые должны передаваться вне обычных кодовых путей return или yield. Код Python перехватывает эти исключения все время, включая их игнорирование. - person Martijn Pieters; 03.12.2013
comment
Посмотрите на pythonic vs not pythonic, чтобы определить, имеет ли смысл практика кодирования. Python не существует в пузыре сам по себе. - person mcgyver5; 03.12.2013
comment
@mcgyver5: Таким образом, в Python заявление о том, что игнорирование исключений — это ПЛОХАЯ ПРАКТИКА, совершенно очевидно и тревожно неверно. - person Martijn Pieters; 03.12.2013
comment
@mcgyver5: Конечно, Python не существует в пузыре сам по себе. Но это не означает, что Python для этого должен придерживаться соглашений других языков. Эти другие языки не диктуют, как должно происходить программирование; они тоже не живут в пузыре. В нынешнем виде лучшие практики Python местами различаются. потому что это другой язык местами. - person Martijn Pieters; 03.12.2013
comment
@mcgyver5: приглашаю вас прочитать страницу обработки исключений в вики Python, где обсуждается Python. исключения по сравнению с другими языками, явно. В частности, он позволяет писать более чистый код за счет использования исключений и обработки исключений, тем самым предотвращая ошибки. - person Martijn Pieters; 03.12.2013
comment
Условные обозначения в других языках существуют по причине: так много путаницы из-за того, что программа продолжает весело работать, когда она получает неверный ввод, как это делает ваш фрагмент кода. И я допускаю, что есть случаи, когда можно было бы это сделать — не всегда плохая практика. Я не согласен с тем, что питон особенный. Я думаю, что исключения для преподавания урока предполагают, что ученик будет использовать их, чтобы сообщить пользователю, что был получен неверный ввод, а не скрывать этот факт. - person mcgyver5; 03.12.2013
comment
@ mcgyver5: Но в этом и заключается концептуальная разница. Это не о плохом входе. Речь идет о признании того, что ввод содержит больше, чем просто цифры, и об их эффективной и элегантной обработке. Речь идет не об игнорировании плохого ввода, ввод совершенно легальный и правильный. Вы хотите правильно обрабатывать ввод, так как он обрабатывается предназначен. - person Martijn Pieters; 03.12.2013
comment
@mcgyver5: Теперь, если бы я использовал обработчик blanket, кроме обработчика, перехватывающий все исключения без разбора, тогда вы могли бы быть правы. Я не раз критиковал людей за общую обработку исключений. Обратите внимание, что в этом ответе я говорю OP не перехватывать TypeError исключений; вы не должны получать TypeError, если ввод является строкой. - person Martijn Pieters; 03.12.2013
comment
@ mcgyver5: Однако, если вы осудите всю обработку исключений Python, которая подавляет определенные исключения, вы будете далеки от освоения этого языка. У каждого языка программирования есть своя идиома и сильные стороны, научитесь использовать их в своих интересах. То, как Python обрабатывает исключения, является одной из сильных сторон Python. - person Martijn Pieters; 03.12.2013