最近在用django做一个小东西,目录结构什么的都设置好了,要写views.py。
因为仅仅是测试,所以输出一个字符串表示一下就可以了,于是开始:
def index(request):
return HttpResponse("index page!")
def foo(request):
return HttpResponse("foo page!")
def bar(request):
return HttpResponse("bar page!")
......
我可没兴趣写这么蛋疼的东西,于是希望通过一个列表自动生成这些函数。
折腾了一会,得出了以下的代码:
# Create your views here.
from django.http import HttpResponse
import sys
def gen(lst):
for i in lst:
def _f(request):
return HttpResponse("%s page!" % i)
_f.func_name = i
yield _f
l = [
'index',
'purchase',
'message',
'setting',
'message_post',
'message_anonpost',
'setting_update',
'ajax_history',
'ajax_purchase',
'ajax_message_setviewed'
]
for i in gen(l):
sys.modules[__name__].__dict__[i.func_name] = i
恩, 看起来很让人满意,于是测试一下,发现所有的view都只显示"ajax_message_setviewed page!",也就是最后一个。
搞的我挺郁闷,这是怎么回事呢。。。。。。
仔细做实验外加分析了一下,发现所有的函数共享这同一个i变量(就是gen函数里的i)。
恩 因为gen函数只调用了一次,所以i变量就只创建了一次,所以所有的函数都引用同一个i了。
知道症结后,改写代码如下:
# Create your views here.
from django.http import HttpResponse
import sys
def gen(fn):
def _f(request):
return HttpResponse("%s page!" % fn)
_f.func_name = fn
return _f
l = [
'index',
'purchase',
'message',
'setting',
'message_post',
'message_anonpost',
'setting_update',
'ajax_history',
'ajax_purchase',
'ajax_message_setviewed'
]
for i in l:
sys.modules[__name__].__dict__[i] = gen(i)
问题解决了
分享到:
相关推荐
Python闭包实例closure.py 简单示例闭包的使用 简单示例闭包的使用
在Python编程语言中,闭包(closure)是一种常见的概念,它涉及到函数和作用域,经常会在代码中扮演重要角色。理解闭包及其相关注意事项,对于编写高效、正确的Python代码来说至关重要。本文档详细解释了闭包的概念...
1. **Python 2.7.3**: Closure Linter依赖于Python 2.7版本,因为它是用Python编写的。这个".msi"文件是Windows操作系统上的Python安装程序,用户需要先安装这个版本的Python才能继续安装和运行Closure Linter。安装...
python decorator & closure demo code for learning the use tips
在编程语言理论中,"closure"一词通常指的是“闭包”,它是一个非常重要的概念,尤其是在函数式编程和动态类型语言中。闭包是函数和与其相关的引用环境(即变量的值)的组合,这个组合使得函数能够记住它被定义时的...
10. **闭包(Closure)**:闭包是内嵌函数的一种形式,其中内部函数引用了外部函数的局部变量,即使外部函数执行结束,这些变量仍然被内部函数保留。闭包可以用来创建持久化的局部变量,常用于函数工厂、数据封装和...
Python是一种解释型的、面向对象的、带有动态语义的高级程序设计语言。它是由荷兰人吉多·罗萨姆于1989年发布的,第一个公开发行版发行于1991年。Python注重解决问题的方法,而不是语法和结构。它被广泛应用于各个...
资源分类:Python库 所属语言:Python 资源全名:closure-20180204-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
Closure Compiler是Google开发的一款强大的JavaScript代码优化工具,其主要功能是对JavaScript代码进行压缩和混淆,以提高代码的运行效率和安全性。"closure-compiler-v20171112.jar"是该编译器的一个特定版本,发布...
"closure-library-master" 是一个与 Google 的 Closure Library 相关的开源项目。Closure Library 是一个广泛使用的 JavaScript 库,尤其在构建大型、高性能的 Web 应用程序时非常有用。这个库提供了大量的实用工具...
Closure Table 是数据库设计中一种处理层次结构数据的方法,主要用于存储具有层级关系的数据,例如组织架构、类别层次等。在这个名为 "Closure-Table-ClosureTable.rar" 的项目中,开发者使用了Spring、SpringMVC...
If you're ready to use Closure to build rich web applications with JavaScript, this hands-on guide has precisely what you need to learn this suite of tools in depth. Closure makes it easy for ...
在Python编程语言中,函数是组织代码的基本单元,它们提供了重用性和模块化的特性。然而,初学者在使用函数时可能会遇到一些常见的“坑”,这些陷阱往往与局部变量作用域和迭代器的使用有关。本篇文章将深入探讨这两...
Google Closure 是一个强大的JavaScript开发工具集,由Google开源并维护。这个框架包含了多个部分,旨在帮助开发者编写高质量、高性能的JavaScript代码。Closure的核心组件包括: 1. **Closure Library**:这是一个...
2. VCCT(Virtual Crack Closure Technique):这是一种常用的裂纹扩展模拟方法,适用于预测复合材料的裂纹行为。在Python中,可以编写脚本来定义裂纹路径、裂纹尖端的边界条件以及裂纹扩展准则。 3. COHESIVE...
8. **函数式编程**:Python支持函数式编程风格,如高阶函数(higher-order function)、闭包(closure)和装饰器(decorator)。`map()`、`filter()`和`reduce()`等函数是函数式编程的典型应用。 9. **文件操作**:...
Python语言在设计之初受到了LISP(List Processing)语言的显著影响,这在它的函数式编程特性上体现得尤为明显。LISP是一种早期的高级编程语言,以其简洁的语法和强大的函数式编程能力著称。在Python中,我们也能...