try: VAR = ... except: VAR = ... finally: VAR - 局部变量 'VAR' 可能在赋值前被引用

try: VAR = ... except: VAR = ... finally: VAR - Local variable 'VAR' might be referenced before assignment

为什么 PyCharm 警告我 streamer 可能在赋值前被引用?在我看来,所有情况都包含在 tryexcept 块中,因此在 finally 块中始终定义 streamer

    try:
        streamer = Streamer.objects.get(user_id=self.user_id)
    except Streamer.DoesNotExist:
        streamer = Streamer.objects.create(**streamer_attrs)
    except:
        streamer = Streamer.objects.create(**streamer_attrs)
    finally:
        for fieldname, value in streamer_attrs:
            setattr(streamer, fieldname, value)

这个警告背后有什么原因吗?

如果您的 except 部分中的作业也抛出异常(并且可能):

except:
    streamer = Streamer.objects.create(**streamer_attrs)

.. 那么 finally 块仍然会被执行,但是 streamer 不会被定义。我认为问题是您没有意识到即使发生异常也会执行 finally

只有 finally 不会 运行 的情况是,如果事先终止了具有该块的线程或进程,您退出了程序(使用 exit())或其他方式底层失败(如 OS、虚拟机、容器等)