假设我有以下Python代码:
x = some_product()
name = x.name
first_child = x.child_list[0]
link = x.link
id = x.id
当 x.child_list 无时,第3行可能会出现问题。这显然给了我一个 TypeError ,说:
'NoneType' Object has no attribute '_____getitem_____'
我想要做的是,每当 x.child_list [0] 给出 TypeError 时,只需忽略该行并转到下一行,即“< strong> link = x.link “......
所以我猜这样的事情:
try:
x = some_product()
name = x.name
first_child = x.child_list[0]
link = x.link
id = x.id
Except TypeError:
# Pass, Ignore the statement that gives exception..
我应该在Except块下放置什么? 或者还有其他方法可以做到这一点吗?
我知道我可以使用如果x.child_list不是None:... ,但我的实际代码要复杂得多,我想知道是否有更多的pythonic方法可以做此
答案 0 :(得分:8)
你在考虑的是:
try:
x = some_product()
name = x.name
first_child = x.child_list[0]
link = x.link
id = x.id
except TypeError:
pass
但是,最好的做法是尽可能少地放在try/catch
块中:
x = some_product()
name = x.name
try:
first_child = x.child_list[0]
except TypeError:
pass
link = x.link
id = x.id
但是,你真正应该在这里做的是完全避免try/catch
,而是做这样的事情:
x = some_product()
name = x.name
first_child = x.child_list[0] if x.child_list else "no child list!"
# Or, something like this:
# first_child = x.child_list[0] if x.child_list else None
link = x.link
id = x.id
当然,您的选择最终取决于您所希望的行为 - 您是否希望first_child
未定义,等等。
答案 1 :(得分:3)
由于您只想在该行上处理异常,因此只能在那里捕获它。
x = some_product()
name = x.name
try:
first_child = x.child_list[0]
except TypeError:
first_child = None
link = x.link
id = x.id
答案 2 :(得分:2)
当您捕获异常时直接移出try范围,更好的解决方案是通过修改该行中的代码来防止异常发生:
if x.child_list[0] != None:
first_child = x.child_list[0]
希望这会有所帮助。
修改强>
当你编辑你的问题并且你不想要这个解决方案时,唯一的方法是在该特定行之后立即捕获异常:
try:
first_child = x.child_list[0]
except TypeError:
pass
答案 3 :(得分:2)
当x.child_list为None时,第3行可能会出现问题。这显然给了我一个TypeError,说:
我认为用异常做这件事是不好的方法。 str / unicode,list,tuple types有 getitem 方法或任何其他自定义类可能包含此方法。如果您正在寻找仅使用元组/列表的解决方案,此代码将帮助您:
x = some_product()
name = x.name
first_child = (lambda x: x[0] if isinstance(x, list) or isinstance(x, tuple) else None)(x.child_list)
link = x.link
id = x.id
请阅读有关格式化python代码的PEP8。