Python 是什么让你尝试:早点退出?

Python 是什么让你尝试:早点退出?,python,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 tr

在下面的函数中,什么使
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!
结果如下:


这是一个有趣的错误,你有。因此,在函数外部有一个模块作用域为
tiles
,由于您没有使用
全局
,因此您正在函数内部创建一个新的
tiles
变量。这很好。或者也可以,只是(当我在交互式Python中胡闹时)语句的左值(左边的
tiles
)是局部的,使得整个语句认为对tiles的任何引用都意味着局部的。因此,在该映射构造中,除了本地模块还不存在之外,它使用本地模块,而不是使用模块
tites


这可能是Python中的一个bug,但可能是故意的。

它不起作用的原因是因为您在全局范围中定义了
tiles
。在要分配给
平铺的函数中
。这使得
平铺
成为函数中的局部作用域名称。这反过来意味着函数中的代码根本不会在全局范围中查找
tiles

在赋值中,您试图获取
平铺
(这是在本地赋值之前)。这会导致引发异常,因为您试图访问未赋值的局部变量

快速修复方法是使用
全局

...
def foobar(in_file, out_file, expression):
    global tiles
    ...
正如其他人所说,不要只捕获异常而不对其进行处理。调试代码时,您希望抛出异常,以便找到并修复原因!请删除
try
except
,或使
except
例外并打印有关它的有用信息,如下所示:

try:
    ...
except Exception, e:
    print 'Oh noes!', e
def foobar(in_file, out_file, expression):
    global tiles
    ...

这可能需要阅读很多内容,但如果您确实阅读了它,您将更好地理解Python:

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

异常输出:

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

很简单,初学者会做这样的事情。@aaronasterling“口袋妖怪异常处理-必须抓住它们!”在没有指定异常的情况下,你不应该
除了:
。这也会捕获键盘中断之类的东西,这几乎从来都不是你想要的。这不是一个bug,事实上它定义得很好。全局变量和局部变量之间存在差异。在这样的情况下,您可以使用
global
关键字:是的,但您可能认为它将首先使用(据当时所知)全局范围计算右侧,然后创建一个局部变量并分配给该变量。Python似乎会提前扫描以查看是否创建了同名的局部变量。您可能应该解释这是因为
tiles
是在函数中本地定义的,这意味着除非使用
global
关键字,否则将忽略任何全局变量。即使您没有全局定义
tiles
,也会发生此错误。您是如何获得UnboundLocalError消息的?我得到的只是沉默。
除了
吞下了例外。如果没有
except
您将得到该错误。真正的except块是
except:\n\tprint gp.GetMessages()\n
我在构建最简单的错误复制时将其取出。谢谢你告诉我发生了什么事。
def foobar(in_file, out_file, expression):
    global tiles
    ...