免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6858 | 回复: 11

很经典的Print self代码,曾经在邮件列表中讨论过! [复制链接]

论坛徽章:
0
发表于 2005-06-09 08:47 |显示全部楼层
来领会Python代码的神奇吧
第一版代码:
  1. # -*- coding: UTF-8 -*-

  2. s = 'def PrintSelf(Input):\n    print "s = " + repr(Input) + "\\n\\n" + Input + "\\n\\n" + PrintSelf(s)'

  3. print "s = " + repr(s) + "\n\n" + s + "\n\n" + "PrintSelf(s)"

复制代码

演变后的第二版代码
  1. # -*- coding: UTF-8 -*-

  2. s = 'print "s = " + repr(s) + "\\n\\n" + s'

  3. print "s = " + repr(s) + "\n\n" + s

复制代码

这个是刘鑫提供的代码,方法不同
  1. # -*- coding: UTF-8 -*-

  2. s = 'print "s = " + repr(s) + "\\n\\n" + s \n\nexec(s)'

  3. print "s = " + repr(s) + "\n\n" + s

  4. exec(s)
复制代码

拷贝出来,运行一下,感受一下神奇吧!

论坛徽章:
0
发表于 2005-06-09 10:26 |显示全部楼层

很经典的Print self代码,曾经在邮件列表中讨论过!

我试了一下,直接crash了。好像是递归了。
楼主解释一下这个程序的作用?

论坛徽章:
0
发表于 2005-06-09 10:30 |显示全部楼层

很经典的Print self代码,曾经在邮件列表中讨论过!

在我这里更夸张,执行结果就是除了第一行的完全拷贝,但单行执行却可以,能解释一下原因吗?

论坛徽章:
0
发表于 2005-06-09 10:56 |显示全部楼层

很经典的Print self代码,曾经在邮件列表中讨论过!

# -*- coding: UTF-8 -*-
这一行的作用是标记本程序使用UTF-8编码,#为注释,但是python会看你是否为标记代码,或者unix下标记python的路径。

这个程序就是打印程序自身,除了第一行外,如果你去掉第一行,程序也能正常执行的。
__repr__ 是一个内置方法,它可以用在任何对象上,不仅仅是类的实例。这个程序的奥妙在repr这个方法上,可能你这样试一下就明白了:
>;>;>; s = 'print "s = " + repr(s) + s'
>;>;>; print repr(s)
'print "s = " + repr(s) + s'
>;>;>; print "s = " + repr(s)
s = 'print "s = " + repr(s) + s'
>;>;>;

论坛徽章:
0
发表于 2005-06-09 11:12 |显示全部楼层

很经典的Print self代码,曾经在邮件列表中讨论过!

Java中也看到过类似的讨论。不过exec(s)在我的RHEL3上出错了。不能用,没有这句exec倒是运行的挺好的。

论坛徽章:
0
发表于 2005-06-09 11:37 |显示全部楼层

很经典的Print self代码,曾经在邮件列表中讨论过!

rh下我没试过。。没有环境,所以无法解答你的问题了。

论坛徽章:
0
发表于 2005-06-09 21:57 |显示全部楼层

很经典的Print self代码,曾经在邮件列表中讨论过!


  1. from traceback import extract_stack
  2. print open(extract_stack()[0][0]).read()
复制代码


python是动态语言

论坛徽章:
0
发表于 2005-06-10 08:42 |显示全部楼层

很经典的Print self代码,曾经在邮件列表中讨论过!

from traceback import extract_stack
print open(extract_stack()[0][0]).read()
我运行提示IO错误来着。

论坛徽章:
0
发表于 2005-06-10 10:22 |显示全部楼层

很经典的Print self代码,曾经在邮件列表中讨论过!


  1. hoxide@mathlinux:~$ python printself.py
  2. from traceback import extract_stack
  3. print open(extract_stack()[0][0]).read()
复制代码


如果你在解释器中:

  1. >;>;>; from traceback import extract_stack
  2. >;>;>; print open(extract_stack()[0][0]).read()
  3. Traceback (most recent call last):
  4.   File "<stdin>;", line 1, in ?
  5. IOError: [Errno 2] No such file or directory: '<stdin>;'
复制代码


这个是个展示自省的例子.就是 读入源文件然后显示之.

论坛徽章:
0
发表于 2005-06-10 11:09 |显示全部楼层

很经典的Print self代码,曾经在邮件列表中讨论过!

明白。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP