所以,我想知道。我有以下问题,在使用弹出的值执行操作之前,字典弹出需要多次检查和平衡。
我知道:
-
如果字典中存在关键字,则
dict.pop()
从字典中删除具有给定关键字的元素并返回其值。 -
如果字典中不存在给定的键,则返回给定的默认值。
-
如果字典中不存在给定的键,并且将"无默认值"传递给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...")