什么在尝试:早退出?

时间:2010-11-24 01:06:44

标签: python

在以下函数中,是什么让try:提前退出?如果我将相同的代码放在def块之外,它可以正常工作。

tiles = ['095D', '094M']
in_file = 'in_file'
out_file = 'out_file'
expression = ''' "FIELDNAME" LIKE 'STUFF' '''

def foobar(in_file, out_file, expression):
    print in_file, out_file, expression
    try:
        print 'this is trying'
        #pretty print tile list, from http://stackoverflow.com/questions/2399112/python-print-delimited-list
        tiles = ','.join(map(str,tiles))
        print 'made it past tiles!'
        print 'From %s \nselecting %s \ninto %s' % (in_file, tiles, out_file)

    except:
        print 'Made it to the except block!'

foobar(in_file, out_file, expression)

结果:

D:\> python xx-debug.py
in_file out_file  "FIELDNAME" LIKE 'STUFF'
this is trying
Made it to the except block!

same code not in a def的结果:

this is trying
made it past tiles!
From in_file
selecting 095D,094M
into out_file

3 个答案:

答案 0 :(得分:3)

它无效的原因是因为您在全局范围内定义了tiles。在您分配给tiles的功能中。这使tiles成为函数中的本地范围名称。反过来,这意味着函数中的代码根本不会在全局范围内查找tiles

在分配中,您正在尝试获取 tiles(这是在本地分配之前。)这会导致异常被引发,因为您尝试访问未分配的局部变量。

快速解决方法是使用global

...
def foobar(in_file, out_file, expression):
    global tiles
    ...

正如其他人所说,不要只是在不做任何事情的情况下捕捉异常。在调试代码时,您想要抛出异常,以便找到并修复原因!删除try ... except,或让except获取例外并打印有关它的有用信息,如下所示:

try:
    ...
except Exception, e:
    print 'Oh noes!', e

这可能需要阅读很多,但如果你阅读它,你会更好地理解Python:

http://docs.python.org/reference/executionmodel.html

它解释了Python如何处理模块范围和函数范围等中的变量定义。它还包括异常。

答案 1 :(得分:3)

异常输出:

Traceback (most recent call last):
  File "sof.py", line 19, in <module>
    foobar(in_file, out_file, expression)
  File "sof.py", line 11, in foobar
    tiles = ','.join(map(str,tiles))
UnboundLocalError: local variable 'tiles' referenced before assignment

现在,这是因为tile实际上是在全局空间中定义的。所以,你的函数应该是这样的:

def foobar(in_file, out_file, expression):
    global tiles
    ...

答案 2 :(得分:-1)

这是一个有趣的错误。所以函数外部有一个模块范围的tiles,因为你没有使用global,所以你在函数内部创建了一个新的tiles变量。这可以。或者它会很好,除了它出现(当我在交互式Python中乱七八糟)语句的左值(左边的tiles)是本地的时候,使整个语句认为对tile的任何引用都意味着当地人。因此,在该map构造中,不使用模块tites,而是使用本地模块,除了本地模块尚不存在。

这可能是Python中的一个错误,但可能是预期的。