Улучшение кода, трудный путь Python ex48

Я завершил упражнение после долгих замешательств и сделал этот код, который соответствует его тестам.

WORD_TYPES = {
   'verb' : ['go', 'kill', 'eat'],
   'direction' : ['north', 'south', 'east', 'west'],
   'noun' : ['bear', 'princess'],
   'stop' : ['the','in','of']
} 

def scan(sentance):
    listy = []
    counter = 0
    for word in sentance.split():
        try:
            count = counter
            for key, value in WORD_TYPES.iteritems():
                for ind in value:
                    if ind == word:
                        counter += 1
                        listy.append((key,ind))
            if count == counter:
                raise KeyError
        except KeyError:
            try:
                value = int(word)
                listy.append(('number',value))
            except ValueError:
                listy.append(('error',word))
    return listy

Автор хотел, чтобы мы использовали попытки и исключения, но я не чувствую, что использовал их эффективно. Как лучше их использовать здесь? Кроме того, когда попытки и исключения действительно идеальны? Любые другие советы по улучшению кода также приветствуются.


person Dan    schedule 02.06.2016    source источник
comment
Возможно, следует переместить в Code Review codereview.stackexchange.com   -  person Daniil Ryzhkov    schedule 02.06.2016


Ответы (1)


Я предполагаю, что вы имеете в виду упражнение в http://learnpythonthehardway.org/book/ex48.html

Автор советует использовать try и except для "мошенничества" при интерпретации чисел, потому что обычно это делается с помощью регулярных выражений. Используя функцию int(), чтобы попытаться преобразовать неизвестные слова в int, вы можете интерпретировать отказ как достойный индикатор того, что это не число - следовательно, перехватывая исключение ValueError.

Ваше другое использование исключений было ненужным.

Конструкция try-except используется только для обработки исключений, которые могут генерировать модули. Его никогда не следует использовать в качестве альтернативы if-else.

Кроме того, вам не нужно просматривать каждый элемент списка, чтобы найти совпадение, просто используйте оператор in.

if ind in value:
    # Do Stuff
person Ramon    schedule 02.06.2016