gpt4 book ai didi

python - 嵌套的 Try/Except 或 If/Else - 如何判断使用哪个?

转载 作者:太空宇宙 更新时间:2023-11-04 02:52:56 25 4
gpt4 key购买 nike

我意识到已经有人讨论过是使用 If/Else 还是 Try/Except block 。这样的问题位于此处:Better to 'try' something and catch the exception or test if its possible first to avoid an exception?

但我想将讨论进一步扩展到 nested try/exceptnested if/elif/else 逻辑 block 。这是设置...我想编写一个函数,允许用户提供字符串文字、整数或可迭代对象。这是一个高级函数,它将为我编写的其他函数提供某种程度的抽象。我的代码是这样的:

def high_level_func(parameter = None):
"""
:param parameter: Can accept the string 'All', a single integer, or an iterable such
as a range or a list or tuple of ints.
"""
try:
if parameter.lower() == 'all'
# .lower because str input should be case-insensitive
return str_all_function(parameter) # Only accepts the
# string 'all' - case insensitive
except AttributeError:
# if parameter is an int or iter end up here because those types
# don't have .lower() methods
try:
for para in parameter:
try:
print(int_input_function(parameter))
except MyException:
raise MyException('An iter of something other than ints was '
'provided and cause this error.')
except TypeError:
# parameter must be an int because ints aren't iterable and end up here
return int_input_function(parameter)

在这种情况下,让我们假设我不知道大多数用户会喜欢什么类型的输入(即,任何给定用户同样可能会传递 intiter 或字符串 'all'。但我们可以安全地假设用户很可能永远不会传递字符串列表或字符串元组 - 非法 iters)

这样做可以吗?还是我最好检查输入的类型并执行 if/elif/else (IEE) 代码块?在您看来,IEE 代码块是否更易于阅读?

替代建议:结合使用 try/except 和 IEE 怎么样?例如,如果输入是字符串文字“all”,则 try/except 可能会尝试降低输入,并且 IEE 将嵌套在 except block 中以检查替代情况(整数或 iter 或非法类型)

更一般地说,如果不将函数编写三次并分别进行测试,我如何判断哪种方法最快?

一个更进一步的问题是,如果 Try/Except 平均比 If/Elif/Else 测试快,但我们认为 If/Elif/Else 具有更好的可读性,那么 Try/Except 方法应该快多少保证将可读性抛到窗外,还是可读性总是在速度面前占上风?还是由编码人员/团队自行决定?

最佳答案

我认为您的输入函数应该负责验证输入,而不是调用它们的函数。之后,您可以让高级函数保持高级并继续尝试使用其中之一,直到成功:

def high_level_function(parameter=None):
try:
return str_input_function(parameter)
except ValueError: # Raised by str_input_function on bad input.
pass

try:
return iter_input_function(parameter) # MyException now propagates itself.
except ValueError: # Raised by iter_input_function on bad input.
pass

try:
return int_input_function(parameter)
except ValueError: # Raised by int_input_function on bad input.
pass

# This should never be hit:
raise ValueError("parameter has unsupported type: " + type(parameter).__name__)

关于python - 嵌套的 Try/Except 或 If/Else - 如何判断使用哪个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43234429/

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