免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1867 | 回复: 7
打印 上一主题 下一主题

字符转字典的疑问 [复制链接]

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-06-23 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-02 21:58 |只看该作者 |倒序浏览
blog = '''{
    url: 'http://txw1958.cnblogs.com',
    uid: 100000
}'''

agent = eval(blog, type('Dummy', (dict,), dict(__getitem__=lambda s,n:n))())   //这段语句执行过程不懂,分解开来也有疑问:


论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-06-23 06:20:00
2 [报告]
发表于 2012-08-03 10:37 |只看该作者
分解下:type('Dummy', (dict,), dict(__getitem__=lambda s,n:n))() 但不知道type(object,bases,dict)是返回什么?
eval(str ,globals())执行过程怎样?
还是求前辈解释

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
3 [报告]
发表于 2012-08-03 11:19 |只看该作者
type(name, bases, dict)
Return a new type object. This is essentially a dynamic form of the class statement. The name string is the class name and becomes the __name__ attribute; the bases tuple itemizes the base classes and becomes the __bases__ attribute; and the dict dictionary is the namespace containing definitions for class body and becomes the __dict__ attribute. For example, the following two statements create identical type objects:

>>> class X(object):
...     a = 1
...
>>> X = type('X', (object,), dict(a=1))


看手册还看不懂么...


blog = '''{
    url: 'http://txw1958.cnblogs.com',
    uid: 100000
}'''

agent = eval(blog, type('Dummy', (dict,), dict(__getitem__=lambda s,n:n))())

Eval函数包括两个参数:
第一个参数是语句, 被当作一条代码执行, 这个eval就是生成一个字典.
第二个参数是 type('Dummy', (dict,), dict(__getitem__=lambda s,n:n))(), 看过上边的说明你就知道这是生成了一个对象, 红色括号是调用类Dummy的构造函数生成对象. 这个对象作为eval执行环境的全局变量.

那么type函数包括3个参数, 其目的是生成基类为dict的, 并且拥有__getitem__方法的类, 名字叫做Dummy. lambda第一个参数s是self,第二个参数n就是n,直接返回n.

关键就到了, eval的第二个参数要求是个字典, 你看type()()正好生成了一个字典的派生类. 然而eval的第二个参数的意图是生成blog的执行全局变量表, 那么url和uid两个东西调用__getitem__直接返回自身, 最后就是生成了blog这个字典.

blog字典的key只能是数值或者字符串类型吧, 可是这里并没有看到lambda做n到str的转换, 那么极有可能url和uid本身就是str/int类型.

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
4 [报告]
发表于 2012-08-03 11:31 |只看该作者
自己试验了一下, 意识到其实eval在你指定的dummy()这个变量表里找变量的时候, 其实就是将url这个非字符串作为一个名字传入dummy()['url']的, 所以lambda直接返回n其实就是返回了url对应的字符串形式"url"。

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-06-23 06:20:00
5 [报告]
发表于 2012-08-03 12:22 |只看该作者
谢谢楼上解答

论坛徽章:
0
6 [报告]
发表于 2012-08-03 13:14 |只看该作者
学习了。这个程序挺酷的。

论坛徽章:
0
7 [报告]
发表于 2012-08-03 17:56 |只看该作者
回复 6# Hadron74


    正是偶想说的。可读性极差的代码,被很多人认为很酷,很厉害。。。。
这也侧面反映了国内的编程环境。。。
之前听过一句“写出来别人读不懂的代码,多数都是垃圾代码”
个人还是觉得比较有道理的。

论坛徽章:
0
8 [报告]
发表于 2012-08-07 11:44 |只看该作者
回复 7# crifan
深表赞同

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP