django - 使用'else:' - 有趣的案例

don*_*yor -1 python django

django的auth中间件有这个代码:

def get_user(request):
    """
    Returns the user model instance associated with the given request session.
    If no user is retrieved an instance of `AnonymousUser` is returned.
    """
    from .models import AnonymousUser
    user = None
    try:
        user_id = request.session[SESSION_KEY]
        backend_path = request.session[BACKEND_SESSION_KEY]
    except KeyError:
        pass
    else: # <------ this doesnot have if-part, but how is it meant to work? 
        if backend_path in settings.AUTHENTICATION_BACKENDS:
            # more code... 
Run Code Online (Sandbox Code Playgroud)

else部分是有趣的,它亘古不变的有if双组分,这是什么?真的很酷,如果我还不知道这一点

nu1*_*73R 6

else形式的其他部分try except

try:
    user_id = request.session[SESSION_KEY]
    backend_path = request.session[BACKEND_SESSION_KEY]
except KeyError:
    pass
else:  
    if backend_path in settings.AUTHENTICATION_BACKENDS:
        # more code... 
Run Code Online (Sandbox Code Playgroud)

else条款在出现时必须遵守除条款以外的所有条款.如果try子句不引发异常,则必须执行的代码很有用.

在这里它只有在代码没有引发任何时才会被执行 KeyErrors

考虑我们有一本字典

>>> a_dict={"key" : "value"}
Run Code Online (Sandbox Code Playgroud)

我们可以try except用来处理KeyErroras

>>> try:
...     print a_dict["unknown"]
... except KeyError:
...     print "key error"
... 
key error
Run Code Online (Sandbox Code Playgroud)

现在,我们需要检查是否发生了键错误,如果没有,else则执行该子句

>>> try:
...     print a_dict["key"]
... except KeyError:
...     print "key error"
... else:
...     print "no errors"
... 
value
no errors
Run Code Online (Sandbox Code Playgroud)

如果提出任何except条款,那么它将不会被执行.

>>> try:
...     print a_dict["unkown"]
... except KeyError:
...     print "key error"
... else:
...     print "no errors"
... 
key error
Run Code Online (Sandbox Code Playgroud)