4 回答
TA贡献1789条经验 获得超8个赞
您的第一个示例非常好。甚至官方的Python文档也推荐这种称为EAFP的样式。
就个人而言,我宁愿避免在不必要时嵌套:
def __getattribute__(self, item):
try:
return object.__getattribute__(item)
except AttributeError:
pass # Fallback to dict
try:
return self.dict[item]
except KeyError:
raise AttributeError("The object doesn't have such attribute") from None
PS。has_key()已在Python 2中弃用了很长时间。请item in self.dict改用。
TA贡献1815条经验 获得超10个赞
虽然在Java中使用异常进行流控制确实是一个坏习惯(主要是因为异常迫使JVM收集资源(更多信息请参见此处)),但在Python中,您有两个重要的原则:鸭子类型和EAFP。基本上,这意味着鼓励您尝试以您认为可行的方式使用对象,并在情况并非如此时进行处理。
总之,唯一的问题是您的代码缩进过多。如果您愿意,请尝试简化一些嵌套,例如上面建议的答案中建议的lqc。
TA贡献1851条经验 获得超4个赞
请小心-在这种情况下,第一个finally被触摸,但也被跳过。
def a(z):
try:
100/z
except ZeroDivisionError:
try:
print('x')
finally:
return 42
finally:
return 1
In [1]: a(0)
x
Out[1]: 1
添加回答
举报