gpt4 book ai didi

python - 处理 Python 中可能同时出现的错误

转载 作者:太空宇宙 更新时间:2023-11-04 04:10:30 24 4
gpt4 key购买 nike

我刚开始学习 python,我想知道我的方法是否是处理可能同时发生的错误的最佳方法。

Input object is: actor = {"name": "John Cleese", "rank": "awesome"}

我定义了一个函数,它应该从 "Y" 属性的值返回 "X" 单词:

def get_property(prop, poz):
ln = actor[prop].split()[poz]
return ln


#this is how I call my function
_prop = "fname"
_poz = 12

print("The actor's %s is %s" % (_prop, get_property(_prop, _poz)))

我的目标是,如果该属性不存在,则使用“名称”和/或如果该值不能拆分为与“_poz + 1”的值一样多的词,则选择值的第一个词那个属性(property)。

我的解决方案如下,如果有更好的方法请告诉我。提前致谢!

# Handle all the exceptions!
#Setup
actor = {"name": "John Cleese", "rank": "awesome"}

#This function should return the "poz"th word of property "prop". If an invalid property is passed then use "name". If an invalid index of the word in the value is passed then use return the first word.

def get_property(prop, poz):
ln = ""
noerr = 0
while noerr == 0:
try:
ln = actor[prop].split()[poz]
except IndexError:
poz = 0
except KeyError:
prop = "name"
else:
noerr = 1
return ln

#Test code
_prop = "fname"
_poz = 12

print("The actor's %s is %s" % (_prop, get_property(_prop, _poz)))

这些是预期的情况及其输出:

案例 1:有效的属性和有效的单词索引

_prop = "name"
_poz = 1
get_property(_prop, _poz) = Cleese

情况 2: 有效属性和无效词的索引

_prop = "name"
_poz = 12
get_property(_prop, _poz) = John

情况 3: 无效的属性和有效的单词索引

_prop = "MIDDLEname"
_poz = 1
get_property(_prop, _poz) = Cleese

案例4:无效的属性和无效的单词索引

_prop = "b-rank"
_poz = 12
get_property(_prop, _poz) = John

最佳答案

你在做什么

“请求宽恕比请求许可更容易”EAFP

在您的代码中,您只需使用获得的参数并希望一切正常(尝试)。如果不是这种情况(except),您相应地更改参数并重试(while)直到它起作用(else)。

所以基本上您正在做的是之后验证您的输入。这带有很多额外的代码(tryexcept 等)。但实际上,根据 Python,这是首选的编码风格

但在您的情况下,尤其是初学者,您的方法有以下缺点:

  • 您的代码变得更复杂并且更难阅读因为您在一个函数中使用了许多不同的技术(尝试使用多个除了while 循环中)
    • 如果您可能忘记了一个案例,您将无法轻易发现!
  • 您的代码执行起来会变慢(在这种情况下您不会感觉到差异,但知道这一点很好),例如:
    • 在最坏的情况下(IndexError + KeyError)你必须经历 3 次 while 循环
  • 您的代码变得“不安全”,例如:
    • 如果更改actor 字典并删除name 键会发生什么情况?您的代码将陷入无限循环,因为 try-except 构造每次都会捕获异常,而不是执行 else 情况。

你应该做什么

“三思而后行”LBYL

因此,针对您的情况,更好的解决方案是在尝试使用输入之前验证您的输入。

在您的情况下,您正在使用两个不同的 data structures ( dictlist ):

  • 对于您的字典,您可以使用 get(key, default) 方法从字典中安全地获取您想要的值
  • 对于您的拆分单词列表,您可以使用 len(list) 方法检查是否有足够的单词

这些方法将帮助您完全避免异常。只需将逻辑添加到您的 get_property 函数即可确保正确处理每个错误情况:

actor = {"name": "John Cleese", "rank": "awesome"}

def get_property(prob, pos, default="name"):
values = actor.get(prob, actor[default]).split()
return values[pos] if pos < len(values) else values[0]

test_values = [("name", 1), ("name", 12), ("MIDDLEname", 1), ("b-rank", 12)]
for prob, pos in test_values:
print(f"{prob}, {pos} => {get_property(prob, pos)}")

这会产生输出:

name, 1 => Cleese
name, 12 => John
MIDDLEname, 1 => Cleese
b-rank, 12 => John

关于python - 处理 Python 中可能同时出现的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56361329/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com