所以我认为我在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')
感谢。
答案 0 :(得分:0)
根据我的想法,强制执行呼叫约定是LBYL的好地方。使用三个参数全部为false调用函数始终是错误的,因此立即引发该异常更加清晰。我也一定要在docstring中描述限制。
EAFP(再次,我的想法)更多适用于您有合理方法处理可能出现的特定异常的情况。