Python Django调用其他函数时发生UnbundLocalError
不久前,我开始用Django编写Python。有时候我会犯一些奇怪的错误,我不知道为什么。那么,让我们从其中一个错误开始 我有一个具有两个功能的视图。例如:Python Django调用其他函数时发生UnbundLocalError,python,django,urlconf,Python,Django,Urlconf,不久前,我开始用Django编写Python。有时候我会犯一些奇怪的错误,我不知道为什么。那么,让我们从其中一个错误开始 我有一个具有两个功能的视图。例如: def view_post(request, slug): """ Shows a single post """ posts = Post.objects(slug = slug).limit(1) for items in posts: post = items cssC
def view_post(request, slug):
"""
Shows a single post
"""
posts = Post.objects(slug = slug).limit(1)
for items in posts:
post = items
cssClasses = css_class_converter({ _css_class_editable })
context = RequestContext(request)
return render_to_response("single.html", { 'post': post, 'class': cssClasses }, context)
def new_post(request):
'''
Opens a blank page for creating a new post
'''
post = Post()
cssClasses = css_class_converter({ _css_class_editable, _css_class_new })
context = RequestContext(request)
return render_to_response("single.html", {'post': post, 'new': True }, context)
然后用我的URLconf给他们打电话。调用view_post函数可以正常工作,没有错误
urlpatterns = patterns('blog.views',
# Examples:
url(r'^$', views.index),
url(r'^(?P<slug>[^\.]+)', 'view_post', name='view_blog_post'),
url(r'^new/$', 'new_post', name='new_blog_post'),
...
urlpatterns=patterns('blog.views',
#示例:
url(r'^$',views.index),
url(r'^(?P[^\.]+),'view_post',name='view_blog_post'),
url(r“^new/$”、“new_post”、name='new_blog_post'),
...
但是在第39行“赋值前引用的局部变量'post'”上,调用新的\u post函数在未绑定的LocalError异常中运行。第39行是视图函数的render\u to\u响应,而不是新函数
所以,为什么我对新函数的调用会在我的视图函数中抛出一个错误?真的,我不知道。我是从C#过来的,所以我确定我没有得到一些特殊的Python规则,这会使我编码错误
更新:由于stackoverflow.com代码面板的原因,这两个函数的缩进不正确。不必在意。
问题在于压痕
def view(request):
...
def new(request):
...
python的不同之处在于:
def view(request):
...
def new(request):
...
您应该确保缩进使用空格,python建议使用4个空格而不是制表符
更新:
问题在于URL:
url(r'^$', views.index),
url(r'^(?P<slug>[^\.]+)', 'view_post', name='view_blog_post'),
url(r'^new/$', 'new_post', name='new_blog_post'),
url(r'^$,views.index),
url(r'^(?P[^\.]+),'view_post',name='view_blog_post'),
url(r“^new/$”、“new_post”、name='new_blog_post'),
将其更改为:
url(r'^$', views.index),
url(r'^new/$', 'new_post', name='new_blog_post'),
url(r'^(?P<slug>[^\.]+)', 'view_post', name='view_blog_post'),
url(r'^$,views.index),
url(r“^new/$”、“new_post”、name='new_blog_post'),
url(r'^(?P[^\.]+),'view_post',name='view_blog_post'),
这是因为url/new/exp与regexp匹配
r'^(?P<slug>[^\.]+)'
r'^(?P[^\.]+)'
问题在于缩进
def view(request):
...
def new(request):
...
python的不同之处在于:
def view(request):
...
def new(request):
...
您应该确保缩进使用空格,python建议使用4个空格而不是制表符
更新:
问题在于URL:
url(r'^$', views.index),
url(r'^(?P<slug>[^\.]+)', 'view_post', name='view_blog_post'),
url(r'^new/$', 'new_post', name='new_blog_post'),
url(r'^$,views.index),
url(r'^(?P[^\.]+),'view_post',name='view_blog_post'),
url(r“^new/$”、“new_post”、name='new_blog_post'),
将其更改为:
url(r'^$', views.index),
url(r'^new/$', 'new_post', name='new_blog_post'),
url(r'^(?P<slug>[^\.]+)', 'view_post', name='view_blog_post'),
url(r'^$,views.index),
url(r“^new/$”、“new_post”、name='new_blog_post'),
url(r'^(?P[^\.]+),'view_post',name='view_blog_post'),
这是因为url/new/exp与regexp匹配
r'^(?P<slug>[^\.]+)'
r'^(?P[^\.]+)'
这个错误听起来很像是调用了查看\u post
查看函数。你确定你的URL模式正确吗?或者两个URL正则表达式都可以指向查看\u post
在view\u post
中,如果查询未找到任何项,则仅在for循环中设置的变量post
将不会被设置,并且render\u to\u response
中对该变量的引用将引发UnboundLocalError
通过在循环之前将post设置为None,可以避免这种情况
def view_post(request, slug):
"""
Shows a single post
"""
posts = Post.objects(slug = slug).limit(1)
post = None # Ensure post is bound even if there are no posts matching slug
for items in posts:
post = items
cssClasses = css_class_converter({ _css_class_editable })
context = RequestContext(request)
return render_to_response("single.html", { 'post': post, 'class': cssClasses }, context)
您可以使用以下更简单的函数了解发生UnboundLocalError的原因:
def first_element(items):
for item in items:
result = item
break
return result
(显然,您不会像这样真正实现first\u元素,但这说明了发生了什么。)
如果使用非空列表调用first\u元素
,它将按预期工作:
>>> first_element([2, 3, 4])
2
但如果使用空列表调用,则结果从未绑定,因此您将得到错误:
>>> first_element([])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in first_element
UnboundLocalError: local variable 'result' referenced before assignment
>>第一个元素([])
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第5行,在第一个元素中
UnboundLocalError:赋值前引用的局部变量“result”
这个错误听起来很像是调用了查看\u post
查看函数。你确定你的URL模式正确吗?或者两个URL正则表达式都可以指向查看\u post
在view\u post
中,如果查询未找到任何项,则仅在for循环中设置的变量post
将不会被设置,并且render\u to\u response
中对该变量的引用将引发UnboundLocalError
通过在循环之前将post设置为None,可以避免这种情况
def view_post(request, slug):
"""
Shows a single post
"""
posts = Post.objects(slug = slug).limit(1)
post = None # Ensure post is bound even if there are no posts matching slug
for items in posts:
post = items
cssClasses = css_class_converter({ _css_class_editable })
context = RequestContext(request)
return render_to_response("single.html", { 'post': post, 'class': cssClasses }, context)
您可以使用以下更简单的函数了解发生UnboundLocalError的原因:
def first_element(items):
for item in items:
result = item
break
return result
(显然,您不会像这样真正实现first\u元素,但这说明了发生了什么。)
如果使用非空列表调用first\u元素
,它将按预期工作:
>>> first_element([2, 3, 4])
2
但如果使用空列表调用,则结果从未绑定,因此您将得到错误:
>>> first_element([])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in first_element
UnboundLocalError: local variable 'result' referenced before assignment
>>第一个元素([])
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第5行,在第一个元素中
UnboundLocalError:赋值前引用的局部变量“result”
示例代码中的缩进是不一致的-如果在实际代码中是这样的话,事情就不会像你期望的那样。是的,谢谢,我知道,但这只是因为堆栈溢出:p示例代码中的缩进是不一致的-如果在实际代码中是这样的话,事情就不会像你期望的那样。是的,谢谢,我不知道但这只是因为堆栈溢出:PNo,不是这样。这只是因为我复制的代码非常难看。它在原始版本中没有问题。它不会引发缩进错误而不是引用错误吗?不太可能,在python中,你可以在funcsYes中定义funcs,我知道。但正如我所说,它在我的文件中是正确的。我的编辑中没有缩进或者。这只是因为这里的代码面板。我将添加一个屏幕截图来澄清这一点。我更新了我的问题并添加了一个屏幕截图。我确定这不是缩进问题。是吗?哦,该死,你对URLconf的看法太正确了。我永远不会想到。谢谢老兄,这可能是解决我许多问题的方法:DNo,不是我t、 这只是因为我复制的代码非常难看。它在原始版本中还可以。它不会引发缩进错误而不是引用错误吗?不太可能,在python中,你可以在funcsYes中定义funcs,我知道