try: VAR = ... except: VAR = ... finally: VAR - 局部变量 'VAR' 可能在赋值前被引用
try: VAR = ... except: VAR = ... finally: VAR - Local variable 'VAR' might be referenced before assignment
为什么 PyCharm
警告我 streamer
可能在赋值前被引用?在我看来,所有情况都包含在 try
或 except
块中,因此在 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、虚拟机、容器等)
为什么 PyCharm
警告我 streamer
可能在赋值前被引用?在我看来,所有情况都包含在 try
或 except
块中,因此在 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、虚拟机、容器等)