2012-01-18 3 views
0

привет, я использую try и за исключением, однако, когда я получил распечатку, кроме если есть еще какая-то дополнительная информация, она продолжает читать ее , когда я использую break, это дает ошибку разрыва снаружи петля. Как остановить python для чтения остальных строк? БлагодаряИзбегайте остальной части строк в python

def translate_word(word): 

    try: 
     return dictionary[word] 
    except KeyError: 
     print 'The ' + str(language) + ' word for ' + str(word) + ' is not found' 

if language == "Italian" : 
    create_dictionary('Italian') 
    print "The Italian word for " + str(word) + " is " + str(translate_word(word)) 

И он печатает как это:

The Italian word for rubbish is not found 

The Italian word for rubbish is None 

Где я только хочу, как:

The Italian word for rubbish is not found 
+5

Пожалуйста, покажите нам какой-нибудь код. –

+0

ok Я привел пример –

ответ

2

Ну, да, если у вас есть два print заявления в своем коде, и оба из них выполнены, вы получите две строки вывода.

Корень проблемы заключается в том, что ваша translate_word() функция делает две вещи:

  1. Она возвращает перевод, если слово в словаре
  2. Он выводит сообщение об ошибке, если слово не в словарь

Вне вашей функции, когда вы ее называете, вы не можете сказать, что произошло. Так что, если слово отсутствует в словаре, происходят две вещи:

  1. translate_word() функция выводит сообщение об ошибке
  2. print оператор печатает возвращаемое значение translate_word() которое, потому что вы ничего не возвращать в этом кейс, None.

Причина, по которой он все еще делает второй print, заключается в том, что вы не сказали этого не делать!

Этот код является беспорядочным. Иногда ваша функция возвращает перевод, а иногда и нет. Иногда он печатает сообщение, а иногда нет.Это затрудняет вызов вызывающего абонента (в данном случае) для планирования остальной части программы.

Что вы должны сделать, это переписать функцию translate_word(), чтобы она сделала одно: возвращает переведенное слово. Если он не может, он должен вернуть None.

def translate_word(word): 
    return dictionary.get(word, None) 

(Обработка исключений не является необходимой; метод в словаре get() делает это для вас На самом деле, вам не нужна функции вообще - dictionary.get(word, None) не намного больше, чем translate_word(word) - но мы будем. предположим, что в более крупной программе он будет делать некоторые другие вещи и должен быть своей собственной функцией. Также это немного читаемо.)

Мы возвращаем None, а не строку «не найдена», чтобы мы могли, при необходимости , легко различают следующие две ситуации:

  1. Слово не найдено в словаре
  2. слово найдено в словаре, и его перевод английских слов «не найден»

None не является строкой, поэтому он никогда не будет перевод для чего угодно. Это делает его безопасным для использования в качестве значения флага, указывающего, что слово не может быть найдено.

Когда вы вызываете функцию, вы затем проверяете возвращаемое значение, чтобы узнать, найдено ли это слово. Если это так, вы можете распечатать переведенное слово. В противном случае вы можете распечатать свое сообщение об ошибке.

translated_word = translate_word(word) 
if translated_word is None: 
    print "The Italian word for %s is not found" % word 
else: 
    print "The Italian word for %s is %s" % (word, translated_word) 

Таким образом, весь код, который делает подобный материал, находится в одном месте, и его легко понять и обосновать. Это называется разделением интересов профессиональными программистами. Считается хорошей практикой, чтобы каждый кусок кода делал одно и только одно, потому что его легче понять, написать и сохранить. В частности, разделение частей ввода/вывода и обработки данных программы почти всегда будет сделать ее более простой.

Рассмотрите: вы потеряли информацию о том, что делала ваша программа, и ваша программа имеет менее десяти строк. Представьте себе, как трудно было бы понять такую ​​программу, если бы у нее было миллион строк , и вы ее не писали!

Есть способы, вы можете упростить этот код еще дальше:

translated_word = translate_word(word) 
print "The Italian word for %s is %s" % (word, 
    translated_word if translated_word else "not found") 

Теперь вы говорите Python!

+0

Спасибо, это было полезно для меня! (Я надеюсь, что смогу ответить так же, как это было однажды). –

+0

Спасибо за это. Я устал от того, чтобы быть единственным, кто объясняет разделение проблем WRT I/O все время :) –

0

Вы можете заменить функцию полностью с помощью простого dict.get:

if language == "Italian" : 
    create_dictionary('Italian') 
    print "The Italian word for " + str(word) + " is " + dictionary.get(word, "not found") 
+0

Операция может не захотеть закончить программу, хотя они могут просто захотеть пропустить оставшуюся часть цикла –

+0

@HunterMcMillen: «Перерыв вне цикла» заставляет меня поверить, что он не в цикле и просто хочет предотвратить запуск остальной части скрипта. Однако вопрос довольно расплывчатый. –

+0

Файл «C: \ Python25 \ lib \ doctest.py», строка 1228, в __run compileflags, 1) в тесте.globs Файл «», строка 1, in переводчик ('итальянский', 'мусор') Файл "H: \ IND104 \ final \ Project 4 - Итальянский-Испанский Переводчик \ translator_q.py », строка 146, в переводчике печать« Итальянское слово для »+ str (слово) +« is »+ str (translate_word (word)) Файл« H: \ IND104 \ final \ Project 4 - Итальянский-Испанский переводчик \ translator_q.py ", строка 131, in translate_word sys.exit() SystemExit –

1

Вы обычно break из цикла:

for line in open('filename', 'r'): 
    if line is 'foo': 
    break 

    # Line isn't foo. Keep going 
1

Тогда вы должны просто сделать:

result = dictionary.get(word, 'Not Found') 
print "The Italian word for " + str(word) + " is " + result 

Из official documentation:
get(key[, default])Возвращает значение ключа, если ключ находится в словаре, иначе по умолчанию.

Обновление:get может использоваться даже на код в комментарии.

Пример:

create_dictionary('Spanish').get(word, 'Not Found') 
+0

проблема, когда я делаю это, если у меня есть функция if, например this, если create_dictionary ('Spanish') [word] == create_dictionary ('Italian') [word]: same = "- то же самое на итальянском и испанском языках." else: same = "", который также дает ошибку –

+0

@SarpKaya: Я обновил свой ответ. Обратите внимание, что исключение KeyError легко можно избежать с помощью 'get', возможно, это поможет вам. В противном случае, пожалуйста, объясните, что делает 'create_dictionary' и какова ваша цель. –

0

Использование ::

numCheck = 1 
def translate_word(word): 
try:   
    return dictionary[word]  
except KeyError:   
    print 'The ' + str(language) + ' word for ' + str(word) + ' is not found' 
    numCheck = 0 

if language == "Italian" and numCheck != 0:  
create_dictionary('Italian')  
print "The Italian word for " + str(word) + " is " + str(translate_word(word)) 

должно помочь. Если операций делать не так много, вы можете использовать exit() для выхода из сценария.