【问题标题】:namespace scope for variables inside try blocktry 块内变量的命名空间范围
【发布时间】:2017-08-29 18:00:16
【问题描述】:

关于这两个选项:

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

对比

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

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

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

【问题讨论】:

  • try 不是新的范围块。变量的作用域是从第一次出现到函数结束,类,...
  • except: pass 不应该是首选
  • 有一个有趣的问题,有人将其标记为重复。是否应该就此关闭? stackoverflow.com/questions/45292479/…
  • @cᴏʟᴅsᴘᴇᴇᴅ 我不这么认为。该 Q+A 专门针对在 except 块中捕获的异常,并且仅在 python-3.x 中。
  • @cᴏʟᴅsᴘᴇᴇᴅ 不,不。问题之间存在细微差别。我链接到的骗子问为什么要声明一个全局名称,然后在 except as <name> 中使用该名称,当后来使用该名称时会引发 NameErrror。肯定有相关的,但不完全是骗局。

标签: python python-2.7 exception-handling scope


【解决方案1】:

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

但是你确定"" 是“失败的”user_id 有意义吗?为什么不用别的东西,例如None

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      执行你给出的两条语句后,结果状态没有区别。

      如果第二个中省略了userid="",如果发生错误,变量将导致undefined。

      应该首选第一个语句,因为它 (a) 更好并且 (b) 更快(userid 在没有发生错误的情况下获得两次分配的值)。

      【讨论】:

        猜你喜欢
        • 2018-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-05
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        相关资源
        最近更新 更多