博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python-代码对象
阅读量:6994 次
发布时间:2019-06-27

本文共 1687 字,大约阅读时间需要 5 分钟。

可调用的对象是python执行环境中最重要的部分,python语句,赋值,表达式,模块等,这些

对象只是构成可执行代码块的拼图的很少的一部分,而这些代码块被称为代码对象。
 
每个可调用的对象的核心都是代码对象。一般来说,代码对象可以作为函数或者方法调用的一部分来
执行,也可以用exec语句或者是内建函数eval()来执行。从整体上来看,一个python模块的代码对象,
是构成该模块的全部代码。
 
如果要执行python代码,那么该代码必须先要转换成字节编译的代码,这才是真正的代码对象。然而,
它们不包含任何关于它们执行环境的信息,这便是可调用物存在的原因,它被用来包装一个代码对象并
提供额外的信息。
udf.func_code就是代码对象,用户定义函数
函数对象是代码对象的包装,而方法则是函数对象的包装。
 
python提供了很多内置函数来支持可调用/执行对象,其中exec用来执行代码对象,complie用于生成代码对象。
  • callable(obj) 判断obj是否可调用。是的话,返回True;否则False
  • compile(string, file, type) 从type类型中创建代码对象;file是代码存放的地方,通常设为''
最后的type有三种类型:
'eval' 可求值的表达式(和eval()一起用)
'single' 单一可执行语句(和exec一起用)
'exec' 可执行语句组(和exec一起用)
  • eval(obj, globals=globals(), locals=locals())
对obj进行求值,obj是已编译为代码对象的表达式,或是一个字符串表达式;全局和局部变量是可选
使用整数,反而报错,只接受字符串和代码对象。
  • exec obj
执行代码对象或者是字符串,也可以是一个文件对象(已经打开的有效的python脚本)
还可以支持脚本文件对象
>>>f = open('try.py')
>>>exec f
#显示执行
>>>exec f #再次调用没反应,这是因为文件指针已经指向文件的末尾
>>> f.tell() #返回当前文件指针的位置
>>> f.seek(0) #重新回到文件头
>>> exec f #又执行成功
>>> f.close() #记得关闭文件
  • input(promp='') 等同于eval(raw_input(promt=''))
 
可以看出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

转载地址:http://xgivl.baihongyu.com/

你可能感兴趣的文章
面向对象设计
查看>>
文件伪装成图片
查看>>
Flume-ng 启动脚本
查看>>
Java并发编程初级篇(四):等待子线程终止
查看>>
jstack 线程状态
查看>>
Oracle Linux配置开机自启动
查看>>
使用Fail2ban阻挡针对公司邮件系统的暴力破解
查看>>
一种手游中实时战斗系统的设计思路
查看>>
【2018更新】小白独立搭建博客--Github Pages和Hexo简明教程
查看>>
JavaScript中的执行环境及作用域
查看>>
小黑小波比.nodejs读取全部文件内容
查看>>
javascript教程大总汇
查看>>
如何使UITableView滚动到最上边
查看>>
linux下如何用命令删除乱码文件
查看>>
顺序链表的实现
查看>>
Java读取导入Excel文件解析
查看>>
同一端口如何区分不同的Socket
查看>>
【Android】Dialog从下往上弹起(Dialog全屏,模态显示)
查看>>
dubbo路由机制分析2(路由设置存储)
查看>>
Cortex系列ARM核心及体系结构介绍
查看>>