基本Python:异常提升和局部变量范围/绑定

Sup*_*ite 4 python scope exception-handling

我有一个基本的"最佳实践"Python问题.我看到已经有与此问题相关的StackOverflow答案,但它们陷入了复杂的例子或涉及多个因素.

鉴于此代码:

#!/usr/bin/python

def test_function():
   try:
      a = str(5)
      raise
      b = str(6)
   except:
      print b

test_function()
Run Code Online (Sandbox Code Playgroud)

什么是避免不可避免的"UnboundLocalError:在赋值之前引用的局部变量'b'"的最佳方法,我将在异常处理程序中获取?

python是否有一种优雅的方式来处理这个问题?如果不是,那么一种不优雅的方式呢?在一个复杂的函数中,我宁愿避免在我之前测试每个局部变量的存在,例如,打印关于它们的调试信息.

Ale*_*lli 10

python是否有一种优雅的方式来处理这个问题?

为了避免打印未绑定名称的异常,最优雅的方法是不打印它们; 第二个最优雅的是确保名称确实被绑定,例如通过在函数的开头绑定它们(占位符None是为此目的而流行的).

如果不是,那么一种不优雅的方式呢?

try: print 'b is', b
except NameError: print 'b is not bound'
Run Code Online (Sandbox Code Playgroud)

在一个复杂的函数中,我宁愿避免在我之前测试每个局部变量的存在,例如,打印关于它们的调试信息

强烈建议您保持功能简单(即复杂).正如Hoare在30年前写的那样(在他的图灵接受演讲"皇帝的旧衣服"中,例如在本PDF中重印):

构建软件设计有两种方法:一种方法是使其变得如此简单以至于显然没有缺陷,另一种方法是使其变得如此复杂以至于没有明显的缺陷.第一种方法要困难得多.

实现和维护简单确有困难:因为你必须实现一定的总功能X,它是世界上最自然的诱惑通过复杂增生这样做成几个复杂的类和杂项星星点点的功能,"聪明"黑客,复制粘贴和编辑"驱动编码"等剧集等.

但是,努力保持您的功能"如此简单以至于显然没有缺陷"是值得的.如果一个函数难以完全单元测试,那就太复杂了:将它分解(即重构)到它的自然组件中,即使它需要工作来挖掘它们.(这实际上是强调单元测试有助于提高代码质量的方法之一:通过不断地激励你保持所有代码完全可测试,同时促使你在结构上简化它).


Iva*_*van 6

您可以在try块之外初始化变量

a = None
b = None       
try:
    a = str(5)
    raise
    b = str(6)
except:
    print b
Run Code Online (Sandbox Code Playgroud)