Как обработать исключение TypeError, вызванное python dict? - PullRequest
1 голос
/ 09 июля 2020

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

 STDERR
Traceback (most recent call last):
  File "main.py", line 18, in <module>
    static ("Avoid success at all costs!")
  File "main.py", line 10, in static
    test.assert_equals(rot13(d),sol(d))
  File "/home/codewarrior/solution.py", line 16, in rot13
    newkey = (get_keyA(i)+13)
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

Цель этого кода - активировать Rot13, если в нем есть числовое значение или пробел, он просто оставит его как оригинал.

ABC = {1: "A", 2: "B", 3:"C", 4: "D", 5: "E", 6: "F", 7: "G", 8: "H", 9: "I", 10: "J", 11: "K",
       12: "L", 13: "M", 14: "N", 15: "O", 16: "P", 17: "Q", 18: "R", 19: "S",
       20: "T", 21: "U", 22: "V", 23: "W", 24: "X", 25: "Y", 26: "Z"}
abc = {1: "a", 2: "b", 3:"c", 4: "d", 5: "e", 6: "f", 7: "g", 8: "h", 9: "i", 10: "j", 11: "k",
       12: "l", 13: "m", 14: "n", 15: "o", 16: "p", 17: "q", 18: "r", 19: "s",
       20: "t", 21: "u", 22: "v", 23: "w", 24: "x", 25: "y", 26: "z"} 

def rot13(message):
    string = list(message)
    new = ""
    for i in string:
        if (i.isnumeric() == False):
            if (i != " "):
                if (i.islower() == False):
                    newkey = (get_keyA(i)+13)
                    if (newkey > 26):
                        newkey -= 26
                    new += ABC[newkey]
                if (i.islower() == True):
                    newkey = (get_keya(i)+13)
                    if (newkey > 26):
                        newkey -= 26
                    new += abc[newkey] 
            else:
                new += i
        else :
            new += i
    return new
    
    
def get_keyA(val): 
    for key, value in ABC.items(): 
        if val == value: 
            return key 

def get_keya(val): 
    for key, value in abc.items(): 
        if val == value: 
            return key 

Да, я не использую кодировку. Я хочу попробовать это без использования. Спасибо, что прочитали, и спасибо за помощь!

1 Ответ

0 голосов
/ 09 июля 2020

ваши функции написаны неправильно и не на pythoni c. мы исправим позже. ошибка заключается в этой строке:

newkey = (get_keyA(i)+13)

вы вызвали метод с i, которого нет в ABC dict. и вы получите None возвращаемое значение из этого метода. следовательно, None + 13 - это то, что python не может обработать (None + int). отсюда и ошибка!

В любом случае эти методы непригодны. python имеют встроенные методы поиска словаря и получения возвращаемого значения:

dict.get(key[, value]) 

get(key[, default]) Возвращает значение для ключа, если ключ находится в словаре, иначе по умолчанию. Если значение по умолчанию не указано, по умолчанию используется значение None, так что этот метод никогда не вызывает ошибку KeyError.

Просто используйте его. Я рекомендую вам добавить попытку, кроме этого блока кода (см. выше). Предположим, что, если ключ i не существует в dict, вы можете вернуть default value, который подходит вашей программе, поэтому использование стать:

ABC.get(i, <some_default_value>) 

например: предположим, я хочу вернуть 0 значение, если ключ i не существует в dict, а затем я хочу добавить его в dict со значением по умолчанию 'foo ', поэтому код становится:

if not ABC.get(i,0):
    ABC[i] = 'foo'  #add the key i to this dict with the value 'foo'

, следовательно, методы, которые вы написали (get_keyA(val) и get_keya(val)), можно удалить!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...