`
feisuzhu
  • 浏览: 14335 次
  • 性别: Icon_minigender_1
  • 来自: 济南
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

感悟Python的closure

阅读更多
最近在用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)

问题解决了
0
0
分享到:
评论

相关推荐

    Python闭包实例closure.py

    Python闭包实例closure.py 简单示例闭包的使用 简单示例闭包的使用

    Python closure闭包解释及其注意点详解

    在Python编程语言中,闭包(closure)是一种常见的概念,它涉及到函数和作用域,经常会在代码中扮演重要角色。理解闭包及其相关注意事项,对于编写高效、正确的Python代码来说至关重要。本文档详细解释了闭包的概念...

    Closure Linter完整安装包

    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

    python decorator & closure demo code for learning the use tips

    closure闭包

    在编程语言理论中,"closure"一词通常指的是“闭包”,它是一个非常重要的概念,尤其是在函数式编程和动态类型语言中。闭包是函数和与其相关的引用环境(即变量的值)的组合,这个组合使得函数能够记住它被定义时的...

    Python 八股文.pdf

    10. **闭包(Closure)**:闭包是内嵌函数的一种形式,其中内部函数引用了外部函数的局部变量,即使外部函数执行结束,这些变量仍然被内部函数保留。闭包可以用来创建持久化的局部变量,常用于函数工厂、数据封装和...

    python学习-07-closure-deco.zip

    Python是一种解释型的、面向对象的、带有动态语义的高级程序设计语言。它是由荷兰人吉多·罗萨姆于1989年发布的,第一个公开发行版发行于1991年。Python注重解决问题的方法,而不是语法和结构。它被广泛应用于各个...

    Python库 | closure-20180204-py3-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:closure-20180204-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    closure-compiler-v20171112.jar

    Closure Compiler是Google开发的一款强大的JavaScript代码优化工具,其主要功能是对JavaScript代码进行压缩和混淆,以提高代码的运行效率和安全性。"closure-compiler-v20171112.jar"是该编译器的一个特定版本,发布...

    closure-library-master

    "closure-library-master" 是一个与 Google 的 Closure Library 相关的开源项目。Closure Library 是一个广泛使用的 JavaScript 库,尤其在构建大型、高性能的 Web 应用程序时非常有用。这个库提供了大量的实用工具...

    Closure-Table-ClosureTable.rar

    Closure Table 是数据库设计中一种处理层次结构数据的方法,主要用于存储具有层级关系的数据,例如组织架构、类别层次等。在这个名为 "Closure-Table-ClosureTable.rar" 的项目中,开发者使用了Spring、SpringMVC...

    Closure The Definitive Guide

    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中函数常见坑

    在Python编程语言中,函数是组织代码的基本单元,它们提供了重用性和模块化的特性。然而,初学者在使用函数时可能会遇到一些常见的“坑”,这些陷阱往往与局部变量作用域和迭代器的使用有关。本篇文章将深入探讨这两...

    google closure

    Google Closure 是一个强大的JavaScript开发工具集,由Google开源并维护。这个框架包含了多个部分,旨在帮助开发者编写高质量、高性能的JavaScript代码。Closure的核心组件包括: 1. **Closure Library**:这是一个...

    ABAQUS复合材料Python语言例题

    2. VCCT(Virtual Crack Closure Technique):这是一种常用的裂纹扩展模拟方法,适用于预测复合材料的裂纹行为。在Python中,可以编写脚本来定义裂纹路径、裂纹尖端的边界条件以及裂纹扩展准则。 3. COHESIVE...

    python文档

    8. **函数式编程**:Python支持函数式编程风格,如高阶函数(higher-order function)、闭包(closure)和装饰器(decorator)。`map()`、`filter()`和`reduce()`等函数是函数式编程的典型应用。 9. **文件操作**:...

    Python-Python受LISP启发的函数式编程思想

    Python语言在设计之初受到了LISP(List Processing)语言的显著影响,这在它的函数式编程特性上体现得尤为明显。LISP是一种早期的高级编程语言,以其简洁的语法和强大的函数式编程能力著称。在Python中,我们也能...

Global site tag (gtag.js) - Google Analytics