我就差一个编程的

作为我们大学计算机系的系主任,我经常收到一些声称得到了能造就下一个奇迹的好主意的人的来信和电话。这些电话有的十分的有趣!打电话的人有时是一位急切的创业者,醉心于他的想法,认为那是一个能取代Google,超越Facebook,或者是能改变当前的商业面貌,变革整个互联网的好想法。有时打电话的人不是我们学校的,有时是我们大学工商科目、大多是主修商业的学生;年轻人的电话都透露出了富有感染力的创业热情。他们希望能改变这个世界,他们需要我去帮助他们!

他们就差一个编程的。

他们需要有人能接受他们的想法,把这个想法转变成PHP,SQL,HTML,CSS,Java和Javascript代码。这些创业者知道他们现在缺少什么。我是否应该找一两个计算机专业的学生加入他们的项目,帮他们实现呢? 大多数他们这样的项目永远找不到计算机专业的学生来实现。有很多的原因。学生们都在忙于课程和生活。

大多数计算机专业的学生都有了他们喜欢的工作。他们的工作是付现金的(如果不是拿不了的情况下),这比一个不确定的将来才会有的财富的许诺来说对学生们更有吸引力。这些想法和点子对其他人来说并不像对想出他们的这些创业者那样令人兴奋,不像这些创业者由于担心会产生创世纪的成就而坐卧不安。

很多这样有想法的人由于找不到计算机专业的学生或其他编程人员而一而再、再而三的联系我,希望能从我这得到好消息。年轻的创业者们会越来越泄气。他们希望其他人也能像他们一样为这样的想法而激动。(乐观的年轻人呀!)我一直希望他们能找到什么人帮助他们把想法变成现实。这个过程会是令人兴奋的。他们也能从中学到很多东西。

当然,他们似乎也从来没有想到自己是可以去学编程的。

前段时间,我在微博上聊了几句关于接到这些电话的事情。

Andrei Savu用简单的语句对于遇到的这些现象进行了总结:

@wallingf 这就是说,他们把软件开发者当作一种工具。产品 = 行动 != 点子

我在最近写的一篇博客里详细的谈论了这个问题,一个产品的价值来源于拥有一个想法和执行这个想法的组合。你单具备了前者或只有执行后者的能力都不太有价值。你必须把它们组合到一起。

很多“手握绝世好想法的人”都倾向于认为大多数或全部的价值都来源于创造出了这个想法。程序员只是一个工具,就像个鸡毛掸子,拿起来就可以掸灰。编程是个小事情,不是吗?

另一方面,一些程序员乐意认为大多数或所有的价值都来源于实施了这个想法。可是你不能去实施你还没有的想法呀。这就好像我和我的同事们围坐在一盘左宗棠鸡前惋惜我们失去的财富。可实际上没有人失去。财富从未与我们为邻。事实上我们缺少一个致命的条件。没有时间机器或其它机器能使时光倒流。

我仍然希望这些身负好点子的人中,一些人自己该会编程,或想去学编程,这样他们就可以自己来实现自己的想法。这样,他们也可以有机会知道只有超人有力量什么不做也能把理想变为现实。在过去,学习计算机编程是使用计算机的人的必然后果。可遗憾的是,现在全变了。如今使用计算机的必然后果看起来是可以让人接触到一些自己也许认识,也许不认识的人或者只是看看Youtube视频。

哦,想想吧,如果你发现了一个能够赛过Google和Facebook的好想法,那将会是什么样子。时不时的,我非常想告诉那些给我打电话的创业者,他们的想法基本上不会有改变这个世界的希望。但是我没有,至少有两个理由。第一,他们并没有想征求我的意见。第二,总有一段时间后会有另外一个微软或Google出现来改变这个世界。谁又能想到这会是无数想法中的哪一个?如果我和我的同事能够重新回到2000年,去告诉我们的年轻人有关Facebook的事,这些年轻人会有足够的远见来坐下来开发出这个网站吗?我猜不会。

我如何能知道哪一个会是能够改变这个世界的好想法呢?开发出来,努力工作,用你的手指把想法变成人们需要和想要的东西。把程序开发出来的能力是这些有想法的人缺少的一个必要因素。他们去寻找有这种能力的人,这很对。我很想知道,如果每个人都能够把自己的想法变成现实,这个世界将会变成什么样子。

原文出自:http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2010-12.html#e2010-12-01T15_45_40.htm

5月回顾(1)

  • 回顾(1)
    五月份的回顾,应该从软件大赛说起。比完就感觉自己要跪,因为手头不少事情,却是没有认真准备。考完觉得比较悲情,大学基本上就快这样过去了。和王伟龙,江,小强四个人在学校旁边的华莱士吃完饭唏嘘了一会。大学过了三年,自己的专业水平依然烂的一比,每次看到牛人都感到压力甚大。就算卢老师整天说IT行业里天才遍地,不要可以去比,但是依然觉得自己很挫。然后三年基本上就这么过去了。后来知道了自己竟然进了决赛确实出乎意料。在比赛前因为有时基本上还是以Python为主,结果到了比赛的时候写完代码会发现漏了分号。。。。然后和他们三个唏嘘一下就快要成为离开学校的人了,下学期还有多少人会留在实验室,都还是未知。我们也觉得大四了就不太好意赛呆在实验室里占着地了。

然后下午情绪不高,二央说毕业前想和大家合一个影,就去东院那拍了些照片,花开了不少,草地上有许多蒲公英。

这个月感觉有点对不起林胜,之前答应的东西无法完成了。

 

PS:

  • 关于requests
    在做模拟上传的时候遇到了上传form-data的问题

requests的官方只是给了简单的说明,但是自己具体实现的时候想偏了,浪费了很多时间。然后自己又去看了看requests的关于multipart那部分的源码,豁然开朗。

files传文件,data带着form的各个value然后直接一个post就能搞定,倍感轻松

 

  • 关于http抓包
    一开始用wireshark给自己demo抓包 看起来略蛋疼(也许是我没有掌握)

然后发现一个不错的工具 http://requestb.in/

处于beta阶段 还不是很稳定

经常的500让我觉得这个东西是用pyramid写的 因为和我当时构建pyramid时候看到的500特别的像

  • 关于Py
    需要继续改善代码风格和可读性,以后格式化字符串采用%(name)的方式来增加可读性

Metaclass还是不错的

 

  • 关于《白夜行》
    从豆瓣阅读上买了之后终于看完了,只能说精彩。这个小说的最后已经不是普通的推理小说了,凶手和手法都不是特别的重要了,重要的是两个白夜行走之人的故事,有空的话决定再看看东野圭吾的其他小说

 

  • 关于X
    实现了一个进程池来处理任务队列

把那个model搞定了

  • 关于电影
    中国合伙人还不错

  • 关于自己
    先是呕吐不止,第二天病毒性感冒,晚上到医院抽血化验然后开药,然后连续几天发烧腹泻

把键盘回车键的轴里的弹簧敲坏了(说好的多少W次敲击呢),最近准备修

攒钱ing 明天开始艰苦奋斗

也谈青大贱笑二十周年

18号据说会有十分精彩的演出,本来想去走热闹,后来想想确实和我无关,手里还有许多重要的事情要做,估计是不能去看贱笑二十周年演出了。为了迎接贱笑二十周年,学校把所有的教学楼和宿舍楼的外墙全部刷了一遍,至于我们汇园的内部条件,教学楼里面的设施,什么也没变。

据说会换校徽和校训。根据目前的泄密版本,新的校训是在现在的校训的基础上删掉了四个字,“求真 笃志”被删。个人感觉及其不妥。删除就是不要,这样一删的前潜台词就是我们不需要求真,也不需要笃志。个人感觉学校就算弄个 “为人民服务” 作为校训,也比在原来的基础上删掉强。“为人民服务”别人顶多会嘲笑不够文雅,但是你在“明德求真,博学笃志,守正出奇”这十二个字删,给人遐想空间太大。更何况现在学校的官网上还介绍这十二个字的校训是相互依赖,相互联系。

不过这样删校训还是有一定好处的,比如去掉了“求真”二字之后,我们就可以名正言顺的将1909放上去了。我一开始以为1909是国立青岛大学的建校时间,但是去wikipedia查了一下,国立青岛大学在那之前已经建校。查了查1909年在青岛有一所德华大学,可惜后来没有了,也和我们没有什么关系,1909到底出自哪还要靠官方考证。但是看看校园里在昨天新树上的雕塑:闻一多 沈从文 梁实秋,都是国立青岛大学的老师,不知道把他们树在我们的校园里做什么。我只想说,正视历史才能赢得尊重.

之前看到夏娘发状态说青大的失败之处就是让学生没有归属感。在学校三年,经历了学校和学院里太多的事情,就会发现赚钱真的是第一要务,然后学校希望你能不惹事端的过完四年,以期迎来下一批盈利对象。从我入校那一年开始,学校在宿舍楼不够的情况下,将一栋楼改成了实验楼,继续扩招。然后我们就住进了实验了,你可以看到6人宿舍,8人宿舍,10人宿舍,12人宿舍,14人宿舍,还有16人宿舍。大二来到中心校区,你会发现汇源的条件是如此不堪,但是就是在如此不堪的条件下,每次校领导视察,我们都会被导员要求将宿舍的能不用的东西塞入厨柜,然后不能呆在宿舍。我们的奖学金低到一等奖学金只有300,比例也不比其他学校高。食堂的饭菜的价格却是接近一流大学的两倍,所以我们是超一流的?

大一的时候加入了学生会,呆了一年发现自己太笨,不适合呆在里面就退了。其实退的主要原因是因为实在是看不惯一些人,而我又不是那种 以天下为己任 的人,更何况我也没有能力去改正那些不足,我就独善其身的退了,现在看来这虽然还不能说是大学生涯最明智的决定。但也绝对是之一,退了之后有了时间去学专业知识,然后在生活中也认识了不少朋友,惊闻现在学院里学生会成员比例高的惊人,所以要谨慎发言,估计会被喷。。

学校怎么样现在与我无关,可能在很久很久之后,除了问起毕业学校,可能我不会主动提起我有这么一个母校,这么一个学院。

 

关于django中charfield与textfield

昨天和家文讨论过要用那种,然后决定测一下性能

测之前我去瞅了一眼源码 CharField和TextField都会继承Field,但是CharField会在存入数据库之前会做长度的验证。

这个倒是很好的提问了何时使用CharField和TextField

 

关于x

昨天本卿跟我说老王发现了一个可能拿到数据的地方,但是需要我来拿,让我测试下能不能拿到。就去分析了下, 发现还是能拿到数据的,但是不确定会不会频繁请求而被封禁。不过也看到某大公司的搞笑前端注释

 

关于最近

4.29

关于YCM,在编译的时候需要配置上对python的支持

./configure –with-python-config-dir=/your/python/config/ –enable-pythoninterp

 

昨天晚上被和二挂 东升 二央 二牛五个人一起去看得《致青春》。我果然是脸盲。韩庚一出场我就没有认出来 ,然后韩庚的各个侧脸都没有认出来。每一次韩庚登场,我都会问身边的人这人是谁。至于赵又廷对我来说始终是房祖名,各种房祖名。这本小说在很久之前看过,不过等到看电影的时候基本上全部忘却了。昨天下午还在家,翻了翻我那一堆书柜,没想到我当年也文艺过。至于电影,最好的就是结局,算是与电影名字的对应。有些东西留在回忆里反而是最好的。

最近在弄个小东西来模拟微信的一些东西,不过微信部门也算是够狡猾的。那个接口一天就让调用一次。第一天,调用一次,抓包分析。第二天模拟发送,没过, 再正常调用,抓包分析。不断反复。。。。每天只能调一次,想多注册几个帐号还需要等待审核。。。。

晚上在听豆瓣电台,感觉音质越来越差了,突然就很想听周董的歌,感觉以前的歌听起来还是很有感觉的。

最近在看龙应台的《大江大海1949》, 有些东西真是庆幸没有遇到。不过即使是从书上了解,还是觉得很悲怆,还没看完,刚刚看到围长春城,有空继续看。前一阵看了《灭世》,没有电程序员瞬间成为最卑贱的职业,或者说,不再有这个职业。

 

Django的Q就我现在理解,是个不错的东西。最近up的数据不长更新,有时候达不到每天1W步的运动,需要加强锻炼。湖人就这么被扫了,前天在家用电视看了一场。青岛两轮不胜了,对申花被压哨,对辽宁最后扳平。

 

最近把头发剪了,听短的,感觉很凉快。

总结:

就像深水里的鸟,潜向太阳。

 

 

 

 

 

 

 

 

4.22扯淡

最近遇到不少狗血事,不过估计慢慢会好起来的。

昨天青岛中能在91分钟的时候被绝杀,让人遗憾。有时候就是这样,一切都很顺利,场面也占优,然后突然就没有然后了,当然,我说的不是足球。

还有两周就要什么软件大赛,然后再过一个多月ACM,要开始准备刷题了。算法一直是我的弱项(现在想想没有什么是我的强项)。其实还是很偷懒,没有比赛就懒得刷题,整天自己瞎折腾。

不过最近的时间真的挺紧的,软件大赛,ACM准备,网络中心那面有几个学院网站的屁股怎么都擦不干净,b3, ifanr,背单词。哎?我想把自己当超人用,但其实最近注意力挺难集中的。

昨天晚上把up的震动闹钟调到6点, 这样就能在被太阳晒醒前醒过来。开学快两个月,刚开学几个人把那个写完就没被用过的在线考试系统写完了,然后就没有了。挑战杯很光荣的落选了,当然是我们考虑不周。当时组队的时候就应该招一个专门写文档和报告的,结果到最后代码搞定,界面完成之后都不太愿意写那个报告,敷衍敷衍然后就落选了。如果当时找个乐于写文档的人,那么就会大有不同。在得知落选之后其实也算大致了解了挑战杯,当然,我这也属于吃不到葡萄说葡萄酸的行为,其实最终原因一定是我们代码写的不够好,创新性不足,界面不够好看,成果不够优秀导致的。只可惜了我们的代码。

其实还是不甘,不过也就这样了。生活总是在继续,毕竟以后我们又不靠写报告过活,报告写不过就人了(不过诚实的说,确实是我们对报告不够认真)。

学院的青天大老爷和青天小老爷们有时候真是让人不解,不过我很喜欢即将进行的装机大赛,真想参加一把。。。。

刚刚看了下,总算把vim代码pull下来了,YouComplemeMe是个利器,不过对vim版本有要求,而且编译的时候还需要编译上python support才行。不过vundle应该是个更好的东西,以后有空可以装点顺手的插件,迁移也更简单了。

扯淡结束,做事去

 

 

 

 

理解Python的装饰器

原文出自stackoverflow,英文好的同学可以直接戳这里,如果是人人看的那么可能排版不太好,可以戳这里

Python的函数也是对象

为了理解装饰器,你必须首先要理解python里的函数也是对象。这是一个很重要的概念,我们可以来看个小例子:

def shout(word="yes"):
    return word.capitalize()+"!"

print shout()
# 输出 : 'Yes!'

# 作为一个对象,你可以像其他对象一样,将他赋给一个变量
scream = shout

# 注意我们没有使用shout() 因为我们不是在调用shout这个函数,
# 我们把shout这个函数传递给给scream
# 这意味着我们可以调用scream来代替调用shoot
print scream()
# 输出 : 'Yes!'

# 不仅如此,你删掉shout, 仍然可以调用scream
del shout
try:
    print shout()
except NameError, e:
    print e
    #outputs: "name 'shout' is not defined"

print scream()
# 输出: 'Yes!'
我们先把上面的概念记下,过会我们会再回来。     ## Python里函数的另外一个特性:函数可以定义在另外一个函数内(函数中定义函数)
def talk():
    # 你可以在函数“talk”中定义一个函数
    def whisper(word="yes"):
        return word.lower()+"..."

    # 然后在“talk”函数里直接使用“whisper”
    print whisper()

# 你调用了内部定义了“whisper”的talk函数,
# 每一次调用talk,talk中的whisper也会被调用
talk()
# 输出: 
#    "yes..."

# 但是在talk函数之外并不存在whisper:
try:
    print whisper()
except NameError, e:
    print e
    # 输出 : "name 'whisper' is not defined"

##

##

函数引用

从上面的例子可以看出函数是对象,因此:

  • 可以传递给变量
  • 可以在另一个函数中定义
    这意味着一个函数可以返回另外一个函数(返回值是一个函数),我们看一下例子:

    def getTalk(type=”shout”):

    我们接着定义函数

    def shout(word=”yes”):

    return word.capitalize()+"!"
    

    def whisper(word=”yes”) :

    return word.lower()+"...";
    

    然后返回定义的两个函数中的一个

    if type == “shout”:

    # 我们不使用(),因为在这里我们不是在调用它
    # 返回一个函数对象
    return shout  
    

    else:

    return whisper
    

你怎么使用这个东西?

得到一个函数对象然后传递给一个变量

talk = getTalk()

你可以看到这里的talk是一个函数对象

print talk

输出 : <function shout at 0xb7ea817c>

这个对象是函数返回的一个对象

print talk()

输出 : Yes!

你也可以直接用一种很难看的方式直接调用

print getTalk(“whisper”)()

输出 : yes…

既然你可以返回一个函数,那么你也可以传递一个函数对象作为参数

def doSomethingBefore(func): 
    print "I do something before then I call the function you gave me"
    print func()

doSomethingBefore(scream)
# 输出: 
# I do something before then I call the function you gave me
# Yes!
你应该已经能够理解装饰器了。装饰器就是一种包装,能够让你在不改变函数本身的情况下,在其之前或之后执行代码     ## 手工实现装饰器 你会如何实现一个装饰器呢?
# 一个装饰器是一个能够接收另外一个函数作为参数的函数
def my_shiny_new_decorator(a_function_to_decorate):

    # 装饰器在内部定义了一个函数:the_wrapper_around_the_original_function
    # 这是一个对原始函数(a_function_to_decorate)进行包装的函数
    # 所以它可以在原始函数(a_function_to_decorate)之前或者之后执行一些代码
    def the_wrapper_around_the_original_function():

        # 在这里实现一些你希望在原函数执行前执行的代码
        print "Before the function runs"

        # 在这里调用原函数
        a_function_to_decorate()

        # 在这里实现一些需要在原函数执行后执行的代码
        print "After the function runs"

    # 在这时,a_function_todecorate还没有被执行(这是定义过程)
    # 我们返回我们刚刚创建的装饰器函数:the_wrapper_around_the_original_function
    # 这个装饰器包括了原函数以及我们在其之前和之后需要执行的代码
    return the_wrapper_around_the_original_function

# 现在来考虑创建一个你不会再直接调用的函数
def a_stand_alone_function():
    print "I am a stand alone function, don't you dare modify me"

a_stand_alone_function() 
# 输出: I am a stand alone function, don't you dare modify me

# 现在通过装饰它来扩展它的行为
# 只需要将它传给装饰器,它就会动态的被装饰
# 然后你会得到一个新的可以使用的函数

a_stand_alone_function_decorated = my_shiny_new_decorator(a_stand_alone_function)
a_stand_alone_function_decorated()
# 输出:
#    Before the function runs
#    I am a stand alone function, don't you dare modify me
#    After the function runs
现在,你每次想调用a_stand_alone_function,都通过调用a_stand_alone_function_decorated来代替。 这个很好解决, 通过my_shiny_new_decorator返回的函数来重写a_stand_alone_function_decorated
a_stand_alone_function = my_shiny_new_decorator(a_stand_alone_function)
a_stand_alone_function()
#输出:
# Before the function runs
# I am a stand alone function, don't you dare modify me
# After the function runs# And guess what? That's EXACTLY what decorators do!
  ## 揭开装饰器的面纱(好吧,我承认这个副标题略二) 之前的例子,我们通过使用装饰器语法来实现:
@my_shiny_new_decorator
def another_stand_alone_function():
    print "Leave me alone"

another_stand_alone_function()  
#输出:  
#Before the function runs
#Leave me alone
#After the function runs
就这没简单, @decorator等同于:
another_stand_alone_function = my_shiny_new_decorator(another_stand_alone_function)
  装饰器是 设计模式中装饰者模式的python实现。这些经典的设计模式都 被内嵌在python中来简化开发,就像iterators(迭代器)一样。 当然,你可以同时使用多个装饰器(手动装饰器实现):
def bread(func):
    def wrapper():
        print "</''''''>"
        func()
        print "<______/>"
    return wrapper

def ingredients(func):
    def wrapper():
        print "#tomatoes#"
        func()
        print "~salad~"
    return wrapper

def sandwich(food="--ham--"):
    print food

sandwich()
#输出: --ham--

sandwich = bread(ingredients(sandwich))
sandwich()
#输出:
#</''''''>
# #tomatoes#
# --ham--
# ~salad~
#<______/>
使用python语法糖实现:
@bread
@ingredients
def sandwich(food="--ham--"):
    print food

sandwich()
#输出:
#</''''''>
# #tomatoes#
# --ham--
# ~salad~
#<______/>
The order you set the decorators MATTERS:

@ingredients
@bread
def strange_sandwich(food="--ham--"):
    print food

strange_sandwich()
#输出:
##tomatoes#
#</''''''>
# --ham--
#<______/>
# ~salad~
  接下来我们来看一些关于装饰器的高级用法 向被装饰的函数传递参数
# 这不是什么黑魔法,你只需像装饰器传递参数

def a_decorator_passing_arguments(function_to_decorate):
    def a_wrapper_accepting_arguments(arg1, arg2):
        print "I got args! Look:", arg1, arg2
        function_to_decorate(arg1, arg2)
    return a_wrapper_accepting_arguments

# 当你调用由装饰器返回的函数,
# 也就是你在调用a_wrapper_accepting_arguments这个函数,
# 把参数传递给wrapper然后再让它把参数传递给被装饰的原函数

@a_decorator_passing_arguments
def print_full_name(first_name, last_name):
    print "My name is", first_name, last_name

print_full_name("Peter", "Venkman")
# 输出:
#I got args! Look: Peter Venkman
#My name is Peter Venkman

##

##

装饰对象的方法

在Python中对象和方法是很相似的,不同之处在于方法需要将当前对象的因作为第一个参数传递进去。这意味考虑到self之后,你用相同的办法可以为方法创建装饰器,

def method_friendly_decorator(method_to_decorate):
def wrapper(self, lie):
lie = lie - 3 # very friendly, decrease age even more :-)
return method_to_decorate(self, lie)
return wrapper

class Lucy(object):

def __init__(self):
    self.age = 32

@method_friendly_decorator
def sayYourAge(self, lie):
    print "I am %s, what did you think?" % (self.age + lie)

l = Lucy()
l.sayYourAge(-3)

#输出: I am 26, what did you think?
当然,如果你想创建一个通用与函数(function)与方法(method)的装饰器,不需要考虑参数如何,只要用args和*kwargs就行

def a_decorator_passing_arbitrary_arguments(function_to_decorate):

# 装饰器接收所有任何参数
def a_wrapper_accepting_arbitrary_arguments(*args, **kwargs):
    print "Do I have args?:"
    print args
    print kwargs
    # 然后解压缩参数,在这是*args和**kwargs
    # 如果你对压缩和解压缩参数不熟悉,
    # 看这:http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/
    function_to_decorate(*args, **kwargs)
return a_wrapper_accepting_arbitrary_arguments

@a_decorator_passing_arbitrary_arguments

def function_with_no_argument():
print “Python is cool, no argument here.”

function_with_no_argument()

#输出:

#Do I have args?:

#()

#{}

#Python is cool, no argument here.

@a_decorator_passing_arbitrary_arguments

def function_with_arguments(a, b, c):
print a, b, c

function_with_arguments(1,2,3)

#输出:

#Do I have args?:

#(1, 2, 3)

#{}

#1 2 3

@a_decorator_passing_arbitrary_arguments

def function_with_named_arguments(a, b, c, platypus=”Why not ?”):
print “Do %s, %s and %s like platypus? %s” %
(a, b, c, platypus)

function_with_named_arguments(“Bill”, “Linus”, “Steve”, platypus=”Indeed!”)

#输出:

#Do I have args ? :

#(‘Bill’, ‘Linus’, ‘Steve’)

#{‘platypus’: ‘Indeed!’}

#Do Bill, Linus and Steve like platypus? Indeed!

class Mary(object):

def __init__(self):
    self.age = 31

@a_decorator_passing_arbitrary_arguments
def sayYourAge(self, lie=-3): # You can now add a default value
    print "I am %s, what did you think ?" % (self.age + lie)

m = Mary()
m.sayYourAge()

#输出:

Do I have args?:

#(<main.Mary object at 0xb7d303ac>,)

#{}

#I am 28, what did you think?
 

向装饰器传递参数

现在你可能想知道如何向装饰器本身传递参数。你可能不解为什么要这么做,因为之前的装饰器必须接受一个函数作为参数,但不能把被装饰的函数直接传递给装饰器

# 装饰器是个普通的函数

def my_decorator(func):
print “I am a ordinary function”
def wrapper():
print “I am function returned by the decorator”
func()
return wrapper

所以你可以直接调用而不不使用@

def lazy_function():
print “zzzzzzzz”

decorated_function = my_decorator(lazy_function)

输出: I am a ordinary function

它输出 “I am a ordinary function”, 因为你调用了它

@my_decorator

def lazy_function():
print “zzzzzzzz”

输出: I am a ordinary function

my_decorator的调用和使用@my_decorator是十分相似的。你让通过被变量标志的my_decorator来让python调用它。这很重要,因为这个标志可以让你直接指出装饰器

def decorator_maker():

print "I make decorators! I am executed only once: "+
      "when you make me create a decorator."

def my_decorator(func):

    print "I am a decorator! I am executed only when you decorate a function."

    def wrapped():
        print ("I am the wrapper around the decorated function. "
              "I am called when you call the decorated function. "
              "As the wrapper, I return the RESULT of the decorated function.")
        return func()

    print "As the decorator, I return the wrapped function."

    return wrapped

print "As a decorator maker, I return a decorator"
return my_decorator

我们来创建一个装饰器.

new_decorator = decorator_maker()

输出:

I make decorators! I am executed only once: when you make me create a decorator

As a decorator maker, I return a decorator

然后我们来装饰一个函数

def decorated_function():
print “I am the decorated function.”

decorated_function = new_decorator(decorated_function)

outputs:

I am a decorator! I am executed only when you decorate a function.

As the decorator, I return the wrapped function

我们调用一下这个被装饰过的方法:

decorated_function()

#输出:

I am the wrapper around the decorated function. I am called when you call the

decorated function.

As the wrapper, I return the RESULT of the decorated function.

I am the decorated function.

再让我们跳过中间变量来实现同样的事情

def decorated_function():
print “I am the decorated function.”
decorated_function = decorator_maker()(decorated_function)

输出:

I make decorators! I am executed only once: when you make me create a decorator

As a decorator maker, I return a decorator

I am a decorator! I am executed only when you decorate a function.

As the decorator, I return the wrapped function.

最后:

decorated_function()

输出:

I am the wrapper around the decorated function. I am called when you call the

decorated function.

As the wrapper, I return the RESULT of the decorated function.

I am the decorated function.

让我们通过更简洁方式来实现

@decorator_maker()

def decorated_function():
print “I am the decorated function.”

#输出:

#I make decorators! I am executed only once: when you make me create a decorator.

#As a decorator maker, I return a decorator

#I am a decorator! I am executed only when you decorate a function.

#As the decorator, I return the wrapped function.

#然后就到最后了,调用:
decorated_function()

#outputs:

#I am the wrapper around the decorated function. I am called when you call the decorated function.

#As the wrapper, I return the RESULT of the decorated function.

#I am the decorated function.
你觉得怎么样,我们通过@来进行函数调用

回到向装饰器传递参数这个问题上。如果我们使用函数来产生装饰器,我们也可以向这个函数传参

def decorator_maker_with_arguments(decorator_arg1, decorator_arg2):

print "I make decorators! And I accept arguments:", decorator_arg1, decorator_arg2

def my_decorator(func):
    # 向这传递参数是一种闭包特性
    # 如果你不喜欢这种闭包特性,你可以把它传给一个变量
    # 或者看看这:http://stackoverflow.com/questions/13857/can-you-explain-closures-as-they-relate-to-python
    print "I am the decorator. Somehow you passed me arguments:", decorator_arg1, decorator_arg2

    # 不要弄混 装饰器的参数 和 被装饰的方法的参数
    def wrapped(function_arg1, function_arg2) :
        print ("I am the wrapper around the decorated function.n"
              "I can access all the variablesn"
              "t- from the decorator: {0} {1}n"
              "t- from the function call: {2} {3}n"
              "Then I can pass them to the decorated function"
              .format(decorator_arg1, decorator_arg2,
                      function_arg1, function_arg2))
        return func(function_arg1, function_arg2)

    return wrapped

return my_decorator

@decorator_maker_with_arguments(“Leonard”, “Sheldon”)

def decorated_function_with_arguments(function_arg1, function_arg2):
print (“I am the decorated function and only knows about my arguments: {0}”
“ {1}”.format(function_arg1, function_arg2))

decorated_function_with_arguments(“Rajesh”, “Howard”)

#输出:

#I make decorators! And I accept arguments: Leonard Sheldon

#I am the decorator. Somehow you passed me arguments: Leonard Sheldon

#I am the wrapper around the decorated function.

#I can access all the variables

- from the decorator: Leonard Sheldon

- from the function call: Rajesh Howard

#Then I can pass them to the decorated function

#I am the decorated function and only knows about my arguments: Rajesh Howard
像这样,一个需要参数的装饰器,参数可以以变量的形式传递进去:

c1 = “Penny”
c2 = “Leslie”

@decorator_maker_with_arguments(“Leonard”, c1)

def decorated_function_with_arguments(function_arg1, function_arg2):
print (“I am the decorated function and only knows about my arguments:”
“ {0} {1}”.format(function_arg1, function_arg2))

decorated_function_with_arguments(c2, “Howard”)

#输出:

#I make decorators! And I accept arguments: Leonard Penny

#I am the decorator. Somehow you passed me arguments: Leonard Penny

#I am the wrapper around the decorated function.

#I can access all the variables

- from the decorator: Leonard Penny

- from the function call: Leslie Howard

#Then I can pass them to the decorated function

#I am the decorated function and only knows about my arguments: Leslie Howard
 

 

做个练习:一个用来装饰装饰器的装饰器

def decorator_with_args(decorator_to_enhance):

# 我们像之前那样传递参数
def decorator_maker(*args, **kwargs):

    # 创建一个只接受函数作为参数的函数 
    # 但是能够使用maker传递的参数
    def decorator_wrapper(func):

        # 我们将返回原始的装饰器,就像返回一个普通的函数一样 
        # IS JUST AN ORDINARY FUNCTION (which returns a function).
        # 需要注意的是装饰器必须有自己的标识符,否则无法工作
        return decorator_to_enhance(func, *args, **kwargs)

    return decorator_wrapper

return decorator_maker</pre>

然后可以这么使用:

# 你创造了了一个将作为装饰器使用的函数,然后向里面插入了一个装饰器

别忘了,插入的装饰器的标识符是 “decorator(func, args, *kwargs)”

@decorator_with_args

def decorated_decorator(func, args, *kwargs):
def wrapper(function_arg1, function_arg2):
print “Decorated with”, args, kwargs
return func(function_arg1, function_arg2)
return wrapper

然后你可以通过被装饰的装饰器来装饰你的函数

@decorated_decorator(42, 404, 1024)

def decorated_function(function_arg1, function_arg2):
print “Hello”, function_arg1, function_arg2

decorated_function(“Universe and”, “everything”)

#输出:

#Decorated with (42, 404, 1024) {}

#Hello Universe and everything

酷不?

我知道,你上次有这种感觉,应该是听到别人说:“要理解递归,你要先理解递归”的时候。但是掌握了刚才讲的这些之后是不是很爽。

##

装饰器范例

  • 装饰器是Python2.4出现的新特性,确保你的代码跑在2.4或者更高版本上
  • 记住装饰器会延缓函数调用
  • 不能取消装饰。有一些方法能创建可以取消的装饰器,但木有人用。一个函数被装饰了,就是被装饰了。
  • 装饰器装饰函数后,会增加debug难度
    Python2.5通过提供functool模块来解决了上述的最后一个问题。functool.wraps会拷贝被装饰函数的名字 模块 文档等到他的包装器中,而functools.wraps本身也是一个装饰器
    # 直接用装饰器会显得很杂乱
    def bar(func):
    def wrapper():
    print "bar"
    return func()
    
    return wrapper

@bar

def foo():
print “foo”

print foo.name

#outputs: wrapper

“functools” 有助于解决这个问题

import functools

def bar(func):

# 我们说的包装器(wrapper)是用来包装func的
# 下面是见证奇迹的时刻
@functools.wraps(func)
def wrapper():
    print "bar"
    return func()
return wrapper

@bar

def foo():
print “foo”

print foo.name

#输出: foo
 

如何有效的使用装饰器

也许你会有个疑问:我可以用装饰器做什么,它看起来很好很强大,但是如果有个实际例子会更好。

关于在什么情况下使用有很多种可能,传统的用法是当你需要扩展一个外部库函数的行为或者处于debug的需要(但你不想对其直接做做更改,因为这只是临时的),你可以使用一个装饰器来扩展许多函数,不要重写每个函数(DRY原则),举个例子:

def benchmark(func):
“””
A decorator that prints the time a function takes
to execute.
“””
import time
def wrapper(args, **kwargs):
t = time.clock()
res = func(
args, **kwargs)
print func.name, time.clock()-t
return res
return wrapper

def logging(func):
“””
A decorator that logs the activity of the script.
(it actually just prints it, but it could be logging!)
“””
def wrapper(args, **kwargs):
res = func(
args, **kwargs)
print func.name, args, kwargs
return res
return wrapper

def counter(func):
“””
A decorator that counts and prints the number of times a function has been executed
“””
def wrapper(args, **kwargs):
wrapper.count = wrapper.count + 1
res = func(
args, **kwargs)
print “{0} has been used: {1}x”.format(func.name, wrapper.count)
return res
wrapper.count = 0
return wrapper

@counter
@benchmark
@logging

def reverse_string(string):
return str(reversed(string))

print reverse_string(“Able was I ere I saw Elba”)
print reverse_string(“A man, a plan, a canoe, pasta, heros, rajahs, a coloratura, maps, snipe, percale, macaroni, a gag, a banana bag, a tan, a tag, a banana bag again (or a camel), a crepe, pins, Spam, a rut, a Rolo, cash, a jar, sore hats, a peon, a canal: Panama!”)

#输出:

#reverse_string (‘Able was I ere I saw Elba’,) {}

#wrapper 0.0

#wrapper has been used: 1x

#ablE was I ere I saw elbA

#reverse_string (‘A man, a plan, a canoe, pasta, heros, rajahs, a coloratura, maps, snipe, percale, macaroni, a gag, a banana bag, a tan, a tag, a banana bag again (or a camel), a crepe, pins, Spam, a rut, a Rolo, cash, a jar, sore hats, a peon, a canal: Panama!’,) {}

#wrapper 0.0

#wrapper has been used: 2x

#!amanaP :lanac a ,noep a ,stah eros ,raj a ,hsac ,oloR a ,tur a ,mapS ,snip ,eperc a ,)lemac a ro( niaga gab ananab a ,gat a ,nat a ,gab ananab a ,gag a ,inoracam ,elacrep ,epins ,spam ,arutaroloc a ,shajar ,soreh ,atsap ,eonac a ,nalp a ,nam A
 

而使用装饰器的好处是是不需要做多余的重写就能立刻使用:

@counter
@benchmark
@logging

def get_random_futurama_quote():
import httplib
conn = httplib.HTTPConnection(“slashdot.org:80”)
conn.request(“HEAD”, “/index.html”)
for key, value in conn.getresponse().getheaders():
if key.startswith(“x-b”) or key.startswith(“x-f”):
return value
return “No, I’m … doesn’t!”

print get_random_futurama_quote()
print get_random_futurama_quote()

#输出:

#get_random_futurama_quote () {}

#wrapper 0.02

#wrapper has been used: 1x

#The laws of science be a harsh mistress.

#get_random_futurama_quote () {}

#wrapper 0.01

#wrapper has been used: 2x

#Curse you, merciful Poseidon!
 

 

Python本身提供了许多装饰器:property, staticmethod等等。Django使用装饰器来捕获和查看权限等,装饰器用途广泛

 

 

原文出自:http://stackoverflow.com/questions/739ddd654/how-can-i-make-a-chain-of-function-decorators-in-python/1594484#1594484

自动发微博简陋图文教程

 

用班级微博号登录qq微博,然后进入腾讯微博开放平台

按照下图操作:

点击创建应用

出现下图后点确定

 

出现下图后随便填写一下点击提交

 

出现下图后,记下App_Key和App_Secret 后面要用

 

 

 

进入sae.sina.com.cn注册一个开发者账户

注册完成后 按照下图进行

点击红框选中的那个创建新应用

 

填写信息的时候appid随便填写 但是要记下来 开发语言选择第二个 然后下一步

 

 

 

 

进入程序设置界面,如下 点击KVDB 然后点击 启用KV数据库

 

 

然后下载这个东西 qduweibo 解压缩 进入用记事本1asssettings.py

修改如上图 填写的时候需要保留单引号

例如REPLY_TO = ‘QDUXINXI123456’

因为青大信息工程学院团总支的帐号为QDUXINXI123456 不要忘记两边的引号 其余选项也是如此

 

然后将qduweibo文件夹压缩成qduweibo.zip,然后在sae中如下图所示进行上传

然后在里面选择修改好的qduweibo.zip上传

 

然后从浏览器进入http://你的app_id.sinaapp.com 进行授权,输入班级qq号和密码

提交后显示 You Got it表示成功

然后每天9点会自动发一条新华网的正面新闻 并且@你想要@的人 而且确保每个部署这个服务的人的微博内容基本不一样

偶尔一小结

也没什么需要小结的其实,今天下午一犯二导致一个小bug半天没看出来。现在青岛的天气很不错,如果没有风就更好了。

为了响应学校领导的伟大号召(伟大号召就是要求每个班的班长,每天用腾讯微博发一条微博,要求内容积极向上的时事,然后要@一下自己学院的团总支),有时不得不感叹学校越差毛病越多。当然,伟大号召还是要响应的,于是我写了个程序,每天替我自动发一条微博,然后@一下学院团总支。每天帮我发微博的功能好写,但是怎么让内容积极向上却很蛋疼。网易的新闻源必然不符合规范,找了好久,也就新华网的时政新闻是社会大好,万事和谐,积极向上,找的怎是一个蛋疼了得。写的这个东西刚才自己体验了一下,因为要注册腾讯开发者 和 新浪SAE,步骤很繁琐,这是之前没有考虑的到的,虽然搭建简单,但是步骤太繁琐了,有点开始考虑是否要放出这个东西,但是想了想之前在人人上答应了几个人,待会还是要写个教程的好。

关于学院我不想再提,真是可笑,具体的,当然与这个有关。

最近在网络中心做各个学院的网站迁移,对于各个学院的网站只能说是吐槽无力。

Google Reader要关了,今天打开Chrome发现Reader的Chrome app已经不见了,不禁唏嘘不已。Google突然关了Reader,然后就突然给我一种Google一点像微软的错觉。我一直喜欢这家公司,之前写的课程表自动同步也是把数据上传到Google Calendar。但是突然关掉Reader确实令我害怕。新上线的Google Keep也没有了以往面对新产品的热情,而且我有Evernote和Any.Do。前几天突然想到我是不应该用darkof.com的邮箱,来保证我能够一直持有这个地址而不被别人关闭。也许是我想多了。

先坏后好,生活中也不是尽是不如意的事情。先是期待的Trello for ipad和Up for Android都相继发布了,然后是感觉最近明显身体好多了,看了看up上的数据我大概也就每天睡6个小时,但是依然很精神,最近有些活动不足,需要多活动,但是开学的各种颈肩难受最近木有出现。不过运动依然要继续,等会去操场跑步去。

前天国足1:0,92分钟时绝杀伊拉克,因为有事下半场才开始看的,到最后的时候,毛跟我说他受不了卡马乔的战术,不看了,结果没过1分钟于大宝就把伊拉克给绝杀了。不过对卡马乔一点都无爱。

最近的目标是收敛,因为觉得最近有些行为越来越来,越来越跋扈,这样不好。

最近不打算折腾了,看完手头的几本书。The Vampire Diary不追了,太磨蹭,太拖沓。明天 行尸走肉 更新。

关于Python和Duck_Typing的多态

准备完成《Head First》模式上讲的策略模式,就是小鸭子问题。

准备用Python来实现这个设计模式。

遇到问题如下:

1.Python没有类似于Java的动态绑定机制,所以谈不上基于父类引用的多态实现

2.Python如何实现多态

 

通过查找一些资料,发现Python,其实不只是Python,动态语言都采用Duck_Typing(wikipedia)来实现

什么是Duck_Typing

在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为的对象,并调用它的方法。在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的方法。如果这些需要被调用的方法不存在,那么将引发一个运行时错误。任何拥有这样的正确的方法的对象都可被函数接受的这种行为引出了以上表述,这种决定类型的方式因此得名。
 

 

例子如下:


class Duck:
def quack(self):
print(“Quaaaaaack!”)
def feathers(self):
print(“The duck has white and gray feathers.”)

class Person:
def quack(self):
print(“The person imitates a duck.”)
def feathers(self):
print(“The person takes a feather from the ground and shows it.”)
def name(self):
print(“John Smith”)

def in_the_forest(duck):
try:
duck.quack()
duck.feathers()
except (AttributeError, TypeError):
print(“can’t quack()”)

def game():
donald = Duck()
john = Person()
in_the_forest(donald)
in_the_forest(john)

game()

这段代码是维基百科中的 例子, 我稍微加了一点关于异常的代码。这段代码实现了in_the_forest方法的多态,相较于Java和C++,不需要通过父类的引用,即可直接实现多态。

造成这种多态实现方式的不同, 个人认为主要还是由语言特性决定的(静态语言与动态语言的区别)。虽然Python,C++,Java都是强类型语言,但Python因为动态语言的这个特性,不需要强制声明参数类型。这样的特性可以是我们编写的时候只专注于方法的使用,而不需要过去考虑对象的类型。

相较于继承所产生的树形层级结构,Duck_Typing可以使多态平行化。两个没有任何继承关系的类,只要拥有相同的方法,也可以作为参数传入。

 

 

顺带提到的还有重载问题,重载到底是什么,如果语言没有提供重载机制那么是否可以实现重载。

个人的想法是可以实现,拿C来说,个人认为通过使用可变参数就可以实现函数重载。

至于Python,同样可以通过args 或者 *kwarg来实现

 

 

这都是我的个人想法,欢迎交流与纠正