【问题标题】:How to handle TypeError exception raised by python dict?如何处理python dict引发的TypeError异常?
【发布时间】:2020-10-29 16:07:51
【问题描述】:

我似乎找不到此代码的错误。我一直把它作为我的输出日志。

 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 

是的,我没有使用编码。我想在不使用它的情况下尝试一下。感谢您的阅读并感谢您的帮助!

【问题讨论】:

  • 第 16 行的函数 get_keyA() 似乎返回 None

标签: python dictionary typeerror


【解决方案1】:

您的函数编写错误且非 Pythonic。我们稍后会修复。错误在于这一行:

newkey = (get_keyA(i)+13)

您使用i 调用了ABC dict 中不存在的方法。你已经从这个方法中得到了None 返回值。因此,None + 13 是 python 无法处理的 (None + int)。因此错误!

无论如何,这些方法都是不可用的。 python内置了搜索字典并获取返回值的方法:

dict.get(key[, value]) 

get(key[, default]) 如果 key 在 字典,否则默认。如果没有给出默认值,则默认为 无,因此此方法永远不会引发 KeyError。

只需使用它。我建议你添加一个尝试,除了这个代码块(上) 假设,如果dict中不存在键i,那么你可以返回一个适合你的程序的default value,所以用法变成:

ABC.get(i, <some_default_value>) 

例如: 假设如果字典中不存在键 i 时我想返回 0 值,然后我想将其添加到默认值 '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))可以删除!

【讨论】:

  • 他通过遍历字典元素来比较值。如果他必须改变答案,那么他必须改变字典本身
  • 他只需要调用内置方法dict.get!并为他的功能添加一些逻辑。也许如果 key 不存在,那么用 def 值添加它。
  • 我不认为我真的知道如何使用 dict.get(key[, value]) 来获取我正在搜索的值的键。我也尝试过研究它,但它似乎也不正确。你能给我举个例子吗?就像我在上面写的代码中说的那样,如果我想从字典 abc 中获取值 u 的键,我如何只使用调用它的值来放置那个键,把它放在一个变量中并将它返回给我的结果字符串?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 1970-01-01
  • 2013-01-29
  • 2013-10-09
  • 2010-09-17
  • 1970-01-01
相关资源
最近更新 更多