Python例外示例 - LBYL与EAFP

时间:2018-01-11 23:14:38

标签: python exception

所以我认为我在Python中使用EAFP的想法,但在应用它时,我自己的一个例子感觉它会使代码的可读性降低。我正在编写一个简单的密码生成器函数:

def generatePassword(length, letters, numbers, puntuation):

其中length是int,其他参数是Booleans,用于描述构成密码的可能字符。

如果所有3个布尔参数都为False,我需要引发异常。使用LBYL方法,这很简单(并且可读!),但似乎这不是Python中的最佳实践。

如果所有3个参数都为False,则函数中的该行将引发异常:

password += random.choice(charSet)

charSet是基于布尔参数创建的,所以如果它们都是False,那么charSet将是空字符串。随机库将引发IndexError。好的,我抓住了那个异常并提出了我自己的(ValueError?)。

首先,即使是正确的事情也是如此?也许它只是我,但我发现有点做作 - 错误似乎模糊不清并使代码可读性降低?在我看来,用以下内容启动函数更清楚:

if not(letters or numbers or punctuation): raise ValueError('my error msg')

感谢。

1 个答案:

答案 0 :(得分:0)

根据我的想法,强制执行呼叫约定是LBYL的好地方。使用三个参数全部为false调用函数始终是错误的,因此立即引发该异常更加清晰。我也一定要在docstring中描述限制。

EAFP(再次,我的想法)更多适用于您有合理方法处理可能出现的特定异常的情况。