python中的代碼對象


可調用的對象是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






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM