对象没有属性时如何处理错误

时间:2019-05-15 20:11:51

标签: python

我对Python很陌生。这是我的第一个Python代码!有效的代码:

test = {"name": "John Lennon"};
print (test.get("name", 0).split(" ")[1]);

这里发生的是它打印出了Lennon,这是预期的。

如果代码是:

test = {"age": "John Lennon"};
print (test.get("name", 0).split(" ")[1]);

AttributeError: 'int' object has no attribute 'split'将被打印。我了解这是因为0的值无法分割。

如果返回的值为0而不使用if else子句,是否可以优雅/优美地处理?

10 个答案:

答案 0 :(得分:2)

  

是否有一种方法可以优雅/优美地处理返回的值为0而不使用if else子句?

处理此问题的最佳方法是提供允许split()的默认值。因此,这意味着您可以改用空字符串:

print (test.get("name", "").split(" ")[1]);

但是,现在索引出现错误。您可以通过将较长的代码分成较小的部分并将中间值分配给变量来解决此错误:

names = test.get("name", "").split(" ")

然后使用if语句检查姓氏:

if len(names) >= 2:

答案 1 :(得分:2)

在这种情况下,您不应使用get。检查字典中是否包含您要访问的密钥

test = {"age": "John Lennon"}
if "name" in test:
    print(test["name"].split(" ")[1])
else:
    do_something_else()

答案 2 :(得分:1)

我将使用的方法是try-except

try:
    test.get('name', 0).split(' ')[1]
except AttributeError:
    # do something to handle error

很明显,在这种情况下,请勿使用0作为默认值。请使用不会引起错误的有效字符串。

test.get('name', ' ').split(' ')[1]

更可能的错误是IndexError,当给定的名称只有1个单词时会发生。

您可以堆叠except之类的elif子句:

try:
    test.get('name', 0).split(' ')[1]
except AttributeError:
    # do something to handle error
except IndexError as e:
    # you can use ‘as e’ to use the exception
    # e.g print(e)
except (ValueError, TypeError):
    # you can catch multiple exceptions in one clause

答案 3 :(得分:1)

您的{“ age”:“ John Lennon”}字典中没有“名称”键。当您想读取“名称”成员(字典中不存在)时,“获取”方法将0用作默认值。并且您的默认值(0)的类型是没有拆分方法的整数。 您应该将默认值定义为字符串。像这样:

print(test.get("name", " ").split(" ")[1])

答案 4 :(得分:0)

您可以使用try / except

test = {"age": "John Lennon"}
try:
   print (test.get("name", 0).split(" ")[1])
except:
   print('failed to get name')

或者您可以更改.get()的默认返回值

test = {"age": "John Lennon"}
print (test.get("name", " ").split(" ")[1])

答案 5 :(得分:0)

  • 由于与 name 对应的值是字符串,因此 get 的默认值也应为字符串。在这种情况下,它应该是空字符串
  • 如果您想要姓(将是列表中的最后一个元素),请使用 -1 索引(因为即使 split < / em>将无法分割字符串-因此将返回包含该字符串的列表)
>>> test0 = {"name": "John Lennon"}
>>> test1 = {"age": "John Lennon"}
>>>
>>> print(test0.get("name", "").split(" ")[-1])
Lennon
>>> print(test1.get("name", "").split(" ")[-1])

>>>

答案 6 :(得分:0)

我不确定“优雅地处理”是什么意思。如果您在默认的arg中放置一个空格进行获取,则不会出现错误:

>>> test = {"age": "John Lennon"};
>>> print (test.get("name", " ").split(" ")[1]);

>>> 

答案 7 :(得分:0)

try/except

try:
    test = {"age": "John Lennon"}
    print (test.get("name", 0).split(" ")[1])
except AttributeError:
    # doSomething

答案 8 :(得分:0)

在您的情况下,test.get将为您提供密钥的相应值。如果找不到它,它将为您提供作为第二个参数提供的默认值。那是整数0,因此没有split,这就是为什么会出现此错误的原因。只需使用:

test = {"age": "John Lennon"}
print (test.get("name", " ").split(" ")[1])

希望对您有帮助!

答案 9 :(得分:0)

根据this websitedictionary.get()方法具有关键字参数default,可以将其设置为None,如下所示:

test.get(name, default=None)

如果字典中不存在键None,则它将返回name。将您的代码分成两行可以很好地解决此问题:

test = {"name": "John Lennon"};
data = test.get(name, default=None)

if data == None:
    print( data.split(" ")[1] )
else:
    print( "Key {0} not found in 'data.'".format(name) )