国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Python動態定義函數實現

454398 ? 來源:Python貓 ? 作者:Philip Trauner ? 2020-11-19 15:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

作者:Philip Trauner 譯者:豌豆花下貓”

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

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

剖析

逐行檢視代碼,你會發現語言/解釋器的屏障是多么脆弱。

>>> from types import FunctionType

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

在本例中,help() 與 inspect 都可以完成工作,但是查看實際的源代碼,則會揭示出關于數據類型的更多細節。

>>> from inspect import signature
>>> signature(FunctionType)

1. code

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

2. globals

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

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

3. name(可選)

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

4. argdefs(可選)

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

5. closure(可選)

(如果需要在 CPython(PyPy,Jython,…)以外的其它 Python VM 中執行,可能不應該觸及,因為它嚴重地依賴于實現細節)。

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

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

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

exec 模式被用到,因為定義函數需用多個語句。

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

聚合全部內容,并將動態創建的函數指定給一個變量。

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

>>> print(foo_func())

動態生成的函數可以像其它函數一樣被調用。

結尾

除了做實驗,需要用到動態創建函數的場景很少。

玩耍(Toying around) Python 的內部構件是一種深入學習這門語言的好方法。

如果需要,可以毫不費力地越過解釋器/語言的界線。

還是一如既往地:不要濫用語言 (好吧,一點點也無妨,對吧?)

譯者簡介: 豌豆花下貓,生于廣東畢業于武大,現為蘇漂程序員,有一些極客思維,也有一些人文情懷,有一些溫度,還有一些態度。

編輯:hfy

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • python
    +關注

    關注

    57

    文章

    4876

    瀏覽量

    90025
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Python運行本地Web服務并實現遠程訪問

    本文介紹使用Python搭建本地Web服務并結合 ZeroNews 實現公網訪問。
    的頭像 發表于 02-06 11:39 ?149次閱讀
    <b class='flag-5'>Python</b>運行本地Web服務并<b class='flag-5'>實現</b>遠程訪問

    keil定義fputc函數

    函數 fputc 是輸出字符的底層函數,只需要實現這個函數,類似 printf、puts 等函數也可以正常使用了。 由于存在3種文件類型,這
    發表于 01-22 08:25

    函數指針與回調函數解讀

    函數指針是指向函數的指針變量。通過函數指針C語言可以實現各種強大的功能與設計方法。而回調函數函數
    發表于 01-19 07:34

    matlab調用dll動態函數,死機問題,如何強行跳出?

    matlab調用dll動態庫中的函數,例如圖莫斯,發送數據時,經常會卡死,是否有辦法限制時間,比如3秒,沒有回應,就強行結束函數調用。執行后續邏輯。
    發表于 12-31 10:14

    在Termux環境下實現康威生命游戲

    表示細胞網格終端清屏+重繪實現動態效果初始化滑翔機初始位置 循環計算下一代細胞狀態二、完整代碼(可直接在Termux運行)python#!/usr/bin/env python
    發表于 12-21 18:36

    Python調用API教程

    隨著互聯網技術的發展,API(Application Programming Interface)的應用越來越廣泛。API是指一系列預先定義好的接口,用于以標準化的形式、規范的方式、安全高效地完成
    的頭像 發表于 11-03 09:15 ?866次閱讀

    riscv實現定義指令并用qemu運行

    人根據語法規則寫了一個通用的python腳本來生產對應指令解析函數,這也是非常值得學習。qemu是通過指令集解析的,目前只需在decodetree中增加一條cube指令的實現即可。 在target
    發表于 10-31 07:37

    計算程序執行指令數的函數實現

    (來源:手把手教你設計cpu_RISC-V處理器),他們分別存儲了指令計數器的高低32位 至此就大致能理解指令數計算函數實現原理,即通過csrr指令讀minstreth和minstret寄存器得到執行操作前后的指令計數值,再取其差值即可得到該操作耗費的指令數。周期數計
    發表于 10-28 06:27

    CherryUSB怎樣實現U盤動態加載?

    ,致使二者不能同時工作。使用CherryUSB怎樣實現U盤動態掛載和卸載呢?即在不插USB線時,掛載文件系統,應用可正常使用文件系統,當插入USB線時,動態卸載文件系統并掛載U盤,當彈出U盤或插出
    發表于 10-14 07:31

    【M-K1HSE開發板免費體驗】相關源碼之閱讀和分析1-使用XComponent + Vsync 實現定義動畫

    介紹 XComponent 提供了應用在 native 側調用 OpenGLES 圖形接口的能力,本文主要介紹如何配合 Vsync 事件,完成自定義動畫。在這種實現方式下,自定義動畫的繪制不在 UI
    發表于 09-03 16:05

    如何使用自定義設置回調函數

    你好,我正在嘗試編寫自己的自定義設置回調函數,并使用 fastEnum=false。 是否有任何代碼示例或資料可供我參考? void CyU3PUsbRegisterSetupCallback
    發表于 05-21 06:11

    函數指針的六個常見應用場景

    函數指針在嵌入式開發中有著廣泛的應用,它讓代碼更加靈活,減少冗余,提高可擴展性。很多時候,我們需要根據不同的情況動態調用不同的函數,而函數指針正是
    的頭像 發表于 04-07 11:58 ?1475次閱讀
    <b class='flag-5'>函數</b>指針的六個常見應用場景

    詳解RTOS中的Hook函數

    Hook函數是RTOS中的一個關鍵特性,通過該函數,用戶可以增強對任務管理的控制,定義系統行為。
    的頭像 發表于 03-24 16:14 ?1077次閱讀

    使用Python API在OpenVINO?中創建了用于異步推理的自定義代碼,輸出張量的打印結果會重復,為什么?

    使用 Python* API 在 OpenVINO? 中創建了用于異步推理的自定義代碼。 遇到輸出張量的打印結果會重復的問題,即使輸入圖像不同。
    發表于 03-06 07:53

    創建了用于OpenVINO?推理的自定義C++和Python代碼,從C++代碼中獲得的結果與Python代碼不同是為什么?

    創建了用于OpenVINO?推理的自定義 C++ 和 Python* 代碼。 在兩個推理過程中使用相同的圖像和模型。 從 C++ 代碼中獲得的結果與 Python* 代碼不同。
    發表于 03-06 06:22