设为首页 收藏本站
查看: 1689|回复: 0

[经验分享] python中的代码对象

[复制链接]

尚未签到

发表于 2015-4-23 10:08:52 | 显示全部楼层 |阅读模式
  可调用的对象是python执行环境中最重要的部分,python语句,赋值,表达式,模块等,这些

对象只是构成可执行代码块的拼图的很少的一部分,而这些代码块被称为代码对象。

每个可调用的对象的核心都是代码对象。一般来说,代码对象可以作为函数或者方法调用的一部分来
执行,也可以用exec语句或者是内建函数eval()来执行。从整体上来看,一个python模块的代码对象,
是构成该模块的全部代码。

如果要执行python代码,那么该代码必须先要转换成字节编译的代码,这才是真正的代码对象。然而,
它们不包含任何关于它们执行环境的信息,这便是可调用物存在的原因,它被用来包装一个代码对象并
提供额外的信息。
udf.func_code就是代码对象,用户定义函数
DSC0000.png
函数对象是代码对象的包装,而方法则是函数对象的包装。
DSC0001.png

python提供了很多内置函数来支持可调用/执行对象,其中exec用来执行代码对象,complie用于生成代码对象。

  • callable(obj) 判断obj是否可调用。是的话,返回True;否则False

DSC0002.png

  • compile(string, file, type) 从type类型中创建代码对象;file是代码存放的地方,通常设为''

最后的type有三种类型:
'eval' 可求值的表达式(和eval()一起用)
'single' 单一可执行语句(和exec一起用)
'exec' 可执行语句组(和exec一起用)
DSC0003.png

  • eval(obj, globals=globals(), locals=locals())

对obj进行求值,obj是已编译为代码对象的表达式,或是一个字符串表达式;全局和局部变量是可选
DSC0004.png
使用整数,反而报错,只接受字符串和代码对象。

  • exec obj

执行代码对象或者是字符串,也可以是一个文件对象(已经打开的有效的python脚本)
DSC0005.png
还可以支持脚本文件对象
>>>f = open('try.py')
>>>exec f
#显示执行
>>>exec f #再次调用没反应,这是因为文件指针已经指向文件的末尾
>>> f.tell() #返回当前文件指针的位置
>>> f.seek(0) #重新回到文件头
>>> exec f #又执行成功
>>> f.close() #记得关闭文件

  • input(promp='') 等同于eval(raw_input(promt=''))


DSC0006.png
可以看出input会对输入进行eval,而raw_input只是单纯的字符串

利用exec来控制代码测试


#!/usr/bin/env python
def foo():
    return True
def bar():
    'bar() does not do much'
    return
foo.__doc__ = 'foo() does not do much'
#把测试代码用字符串表示
foo.tester = """
if foo():
    print 'PASSED'
else:
    print 'FAILED'
"""
# dir()取得当前命名空间的对象列表
for eachAttr in dir():
    obj = eval(eachAttr)
    # 控制只运行函数类型
    if isinstance(obj, type(foo)):
        if hasattr(obj, '__doc__'):
            print '\nFunction "%s" has a doc string :\n\t%s' % (eachAttr, obj.__doc__)
        if hasattr(obj, 'tester'):
            print 'Function "%s" has a tester... executin' % eachAttr
            exec obj.tester
        else:
            print 'Function "%s" has no tester... skipping' % eachAttr
    else:
         print '"%s" is not a function' % eachAttr
DSC0007.png   


通过 为知笔记 发布  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-59928-1-1.html 上篇帖子: 【工作中的Python】随机点名小脚本 下篇帖子: 基于 Python Matplotlib 模块的高质量图形输出
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表