try 块中变量的命名空间范围

namespace scope for variables inside try block

关于这两个选项:

try:
    userid = get_userid()
except:
    userid = ""

对比

userid = ""
try:
    userid = get_userid()
except:
    pass

有什么区别吗,特别想知道如果 userid 仅在 try 块中设置,命名空间将如何工作?它们是否具有相同的命名空间范围?

一个比另一个更受欢迎吗?

您可以使用locals()查看每种情况下定义的变量。没有区别。

tryexcept 这样的块(还有 ifelifelsewith)没有 "local scope".但是,您不能也不应该期望 try 块中的任何代码都会被执行(因为它可能会失败并直接进入 exceptfinally 块)。

但是你确定 "" as "failing" user_id 有意义吗?为什么不是别的东西,例如 None?

另外你应该避免捕获所有异常,所以我更喜欢这样的东西:

try:
    userid = get_userid()
except Exception:  # or a more specific exception
    userid = None

执行您给出的两个语句后的结果状态没有区别。

如果省略第二个userid="",如果出现错误,变量将返回undefined。

应该首选第一个语句,因为它 (a) 更好并且 (b) 更快(如果没有错误发生,userid 会获得两次赋值)。