真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python中怎么動態(tài)定義函數(shù)

Python中怎么動態(tài)定義函數(shù),相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

豐都ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!

Python騷操作:動態(tài)定義函數(shù)

基于 MIT 許可協(xié)議

在 Python 中,沒有可以在運(yùn)行時簡化函數(shù)定義的語法糖。然而,這并不意味著它就不可能,或者是難以實(shí)現(xiàn)。

 from types import FunctionType

 

 foo_code = compile('def foo(): return "bar"', "", "exec")

 foo_func = FunctionType(foo_code.co_consts[0], globals(), "foo")

 

 print(foo_func())

輸出:

 

 bar

剖析

逐行檢視代碼,你會發(fā)現(xiàn)語言/解釋器的屏障是多么脆弱。

 

 >>> from types import FunctionType

Python 文檔通常不會列出那些非用于手動創(chuàng)建的類的特征(這是完全合理的)。有三種方法可以解決這個問題:help()、inspect(無法查看內(nèi)置方法)、以及最后的解決方案,即查看 CPython 源代碼。

在本例中,help() 與 inspect 都可以完成工作,但是查看實(shí)際的源代碼,則會揭示出關(guān)于數(shù)據(jù)類型的更多細(xì)節(jié)。

 

 >>> from inspect import signature

 >>> signature(FunctionType)

 

1. code

內(nèi)部是一個PyCodeobject ,作為types.CodeType 對外開放。非內(nèi)置方法擁有一個__code__ 屬性,該屬性保存了相應(yīng)的代碼對象。利用內(nèi)置的 compile() 方法,可以在運(yùn)行期創(chuàng)建types.CodeType 對象。

2. globals

如果一個函數(shù)引用的變量不是在局部定義的,而是作為參數(shù)轉(zhuǎn)入、由默認(rèn)參數(shù)值提供、或者通過閉包上下文提供,則它會在 globals 字典中查找。

內(nèi)置的 globals() 方法會返回一個對當(dāng)前模塊的全局符號表(global symbol table)的引用 ,因此能被用來提供一個總是與當(dāng)前表的狀態(tài)相一致的字典。傳入任意其它的字典也是可以的(FunctionType((lambda: bar).__code__, {"bar" : "baz"}, "foo")() == "baz")。

3. name(可選)

控制所返回的函數(shù)的__name__ 屬性。只真正對 lambdas 有用(由于匿名性,它們通常沒有名稱),并且重命名函數(shù)。

4. argdefs(可選)

通過傳入一個包含任意類型的對象的元組,提供了一個方式來供應(yīng)默認(rèn)參數(shù)值(def foo(bar="baz"))。(FunctionType((lambda bar: bar).__code__, {}, "foo", (10,))() == 10)。

5. closure(可選)

(如果需要在 CPython(PyPy,Jython,...)以外的其它 Python VM 中執(zhí)行,可能不應(yīng)該觸及,因為它嚴(yán)重地依賴于實(shí)現(xiàn)細(xì)節(jié))。

一個cell 對象的元組。創(chuàng)建 cell 對象并非完全是直截了當(dāng)?shù)?,因為需要調(diào)用 CPython 的內(nèi)部組件,但有一個庫可以令它更加方便:exalt (無恥的廣告)。(譯注:這個庫是作者開發(fā)的。)

 

 >>> foo_code = compile('def foo(): return "bar"', "", "exec")

compile() 是一個內(nèi)置方法,因此同時也是文檔豐富的。

exec 模式被用到,因為定義函數(shù)需要用多個語句。

 

 >>> foo_func = FunctionType(foo_code.co_consts[0], globals(), "foo")

聚合全部內(nèi)容,并將動態(tài)創(chuàng)建的函數(shù)指定給一個變量。

那個被前一句代碼編譯成的函數(shù),成為了生成的代碼對象的第一個常量,因此僅僅指向 foo_code 是不充分的。這是 exec 模式的直接后果,因為生成的代碼對象可以包含多個常量。

 

 >>> print(foo_func())

動態(tài)生成的函數(shù)可以像其它函數(shù)一樣被調(diào)用。

看完上述內(nèi)容,你們掌握Python中怎么動態(tài)定義函數(shù)的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


網(wǎng)頁名稱:Python中怎么動態(tài)定義函數(shù)
網(wǎng)頁URL:http://weahome.cn/article/pcjshj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部