从 dict() 安全地弹出一个键,并以最惯用的方式,如果 a.)键不存在或 b.)密钥未验证



所以,我想知道。我有以下问题,在使用弹出的值执行操作之前,字典弹出需要多次检查和平衡。

我知道:

  1. 如果字典中存在关键字,则dict.pop()从字典中删除具有给定关键字的元素并返回其值。

  2. 如果字典中不存在给定的键,则返回给定的默认值。

  3. 如果字典中不存在给定的键,并且将"无默认值"传递给pop((,则它将抛出KeyError。

所以,我觉得3。我需要首先处理KeyError异常。如果是,则从字典中弹出该键。

然后,2如果返回默认值,则不执行任何操作。

然后,如果为1,则执行一些验证,因为该值需要匹配预定义的字符串格式(如果细节很重要,则使用Django内置的from django.core.validators import email_re对电子邮件进行Regex匹配(。

我们有以下产品:


def some_function():
try:
email = account.pop('email', None)
except KeyError as ex:
return
if not email:
return
if not email_re.match(email):
return
# Get/Update Or Create SurfAccount:
surf_account, created = SurfAccount.objects.update_or_create(
email=email,
defaults=account
)
return surf_account, surfer

然而,我不确定这是否是将验证与KeyError异常处理程序结合起来执行pop的最惯用方法。。。因为如果我们这样调用函数,我们可能会遇到TypeError:

surf_account, surfer = some_function()

因为验证失败时我们只是"returning"出局。。。

Q.(那么,执行这样一个带验证的字典弹出的最惯用的方法是什么呢?

dict.pop(key, default)将永远不会引发KeyError,如果该键不存在,则只返回默认值。所以你的尝试:except:没有用。

除了以这种方式使用pop之外,这很好,尤其是如果你认为这种情况很常见的话。

第二个注意事项的问题是,函数的调用约定不一致,有时返回两个结果,有时不返回任何结果,因此很难使用。

  • 常见的Python习惯用法建议您的函数在出现无效电子邮件(无论是丢失还是不正确(时引发异常,这样"快乐路径"总是返回两个值,而"不快乐路径"是一个异常处理程序,只需通过引发合适的异常来替换裸露的return
  • 如果出于某种原因不想引发异常,则需要将结果更改为始终为单个值(例如数据类(,或者需要更改错误情况以返回类似None, None的内容(这本身与当前问题的风险不同,因为if some_function()总是会通过(

如果你决定实际返回一些东西,那么你应该根据预期返回的内容返回值,比如:

try:
email = account.pop('email')  # no default value here, so exception can occur
except KeyError as ex:
return None, None

然而,更好的方法是提出一个特定的例外:

try:
email = account.pop('email')
except KeyError as ex:
raise NoAccountFound() from ex

并让呼叫者处理:

try:
some_function()
except NoAccountFound:
print("no account found...")

相关内容

最新更新