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

时间:2017-08-29 18:00:17

标签: python python-2.7 exception-handling scope

关于这两个选项:

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

VS

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

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

是一个优先于另一个吗?

3 个答案:

答案 0 :(得分:6)

tryexcept(以及ifelifelsewith)之类的广告块没有"本地范围&#34 ;.但是,您无法并且不应该期望try块中的任何代码都会被执行(因为它可能会失败并直接进入exceptfinally块)。

但你确定""为"失败" user_id有道理吗?为什么不是别的,例如None

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

执行你给出的两个陈述后,结果状态没有区别。

如果在第二个中省略userid="",如果发生错误,变量将导致未定义。

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