在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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
    +關注

    關注

    56

    文章

    4822

    瀏覽量

    85829
收藏 人收藏

    評論

    相關推薦

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

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

    詳解RTOS中的Hook函數

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

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

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

    在D4100_usb.dll動態庫中應該使用哪些相關的函數才能實現Activex中的MemToFrameBuffer(),LoadToDMD() 功能?

    使用Activex時可以正常讀取圖片并顯示。但當使用D4100_usb.dll動態庫時,不清楚怎樣才能將數據顯示到DMD。 請問在D4100_usb.dll動態庫中應該使用哪些相關的函數才能
    發表于 02-28 06:17

    如何使用Python API創建自定義函數

    Cadence 統一調試平臺 Verisium Debug 提供多種調試功能,如 RTL 調試、UVM 仿真平臺調試、UPF 調試、DMS 調試等。從 IP 到 SoC 級調試,用戶可以利用豐富的調試功能來縮短調試時間。
    的頭像 發表于 02-15 14:27 ?310次閱讀
    如何使用<b class='flag-5'>Python</b> API創建自<b class='flag-5'>定義</b><b class='flag-5'>函數</b>

    深度學習入門:簡單神經網絡的構建與實現

    神經網絡。 首先,導入必要的庫: 收起 python ? import numpy as np ? 定義激活函數 Sigmoid: 收起 python ? def sigmoid(x)
    的頭像 發表于 01-23 13:52 ?387次閱讀

    使用Python實現xgboost教程

    使用Python實現XGBoost模型通常涉及以下幾個步驟:數據準備、模型訓練、模型評估和模型預測。以下是一個詳細的教程,指導你如何在Python中使用XGBoost。 1. 安裝XGBoost
    的頭像 發表于 01-19 11:21 ?964次閱讀

    stdio.h實現了printf函數?

    我們平時包含的 stdio.h 頭文件,里面是不是實現了 printf 函數? 為什么會有這個疑問?因為每次使用 printf,就得包含 stdio.h ,這就導致很多同學誤以為,stdio.h
    的頭像 發表于 12-18 10:28 ?472次閱讀

    SUMIF函數與SUMIFS函數的區別

    : 1. 函數定義 SUMIF函數 :用于對滿足單一條件的單元格求和。其基本語法為 SUMIF(range, criteria, [sum_range]) ,其中: range :應用條件的區域
    的頭像 發表于 10-30 09:51 ?6722次閱讀

    Python常用函數大全

    Python 世界里,有一些寶藏函數和模塊,它們可以讓你編程更輕松、代碼更高效。這篇文章將帶你一一認識這些神器,讓你的開發生活瞬間輕松不少!
    的頭像 發表于 10-27 17:20 ?680次閱讀

    如何實現Python復制文件操作

    Python 中有許多“開蓋即食”的模塊(比如 os,subprocess 和 shutil)以支持文件 I/O 操作。在這篇文章中,你將會看到一些用 Python 實現文件復制的特殊方法。下面我們開始學習這九種不同的方法來
    的頭像 發表于 07-18 14:53 ?626次閱讀

    python函數的萬能參數

    我們通過一個簡單的事例來展示一下函數的萬能參數,我們先寫一個最簡單的函數。
    的頭像 發表于 07-17 14:56 ?488次閱讀
    <b class='flag-5'>python</b><b class='flag-5'>函數</b>的萬能參數

    神經網絡中激活函數定義及類型

    詳細介紹激活函數定義、類型。 激活函數定義和基本功能 2.1 定義 激活函數(Activat
    的頭像 發表于 07-02 10:09 ?1025次閱讀

    ESP32下如何加自定義Python庫?

    我看官方有提供Micropython的bin文件,但我想根據自己外設擴充一下Python庫,這個應該從哪里入手? 之前做過RTT系統的python庫擴充,RTT有提供Micropython的源代碼,直接在里面加自己的庫就行 ESP32下如何加自
    發表于 06-18 06:27

    函數信號發生器的定義、功能及應用

    隨著現代電子技術的飛速發展,電子測試設備在科研、生產、教育等領域的應用越來越廣泛。其中,函數信號發生器作為一種重要的電子測試設備,在電子工程、通信、科研等領域發揮著至關重要的作用。本文將詳細介紹函數信號發生器的定義、分類、功能、
    的頭像 發表于 05-15 14:42 ?2466次閱讀
    主站蜘蛛池模板: 免费无码看av的网站 | 1024手机看片欧美日韩 | 国产一区二卡三区四区 | 噜噜噜色网 | 五月婷婷六月激情 | 日日草天天干 | 四虎国产精品免费观看 | 国产三级在线免费 | 日韩亚洲人成网站在线播放 | 国产日日操 | 欧美一级三级在线观看 | 中文字幕在线一区二区在线 | 亚洲成人午夜影院 | 伊人久久大香线蕉综合高清 | 欧美一级特黄啪啪片免费看 | 在线观看国产日本 | 亚洲精品播放 | 91伊人网 | 亚洲网站大全 | 美女黄页黄频 | 久久99热久久精品99 | 97capcom超频在线 | 天堂社区在线视频 | 欧美午夜寂寞影院安卓列表 | 美女被免费视频网站九色 | 一级片免费在线播放 | 欧美一级免费在线观看 | 99久久精品免费精品国产 | 天天躁夜夜躁狠狠躁2018a | 欧美不卡一区 | 四虎国产欧美成人影院 | 黄色网视频 | 综合色中色 | 五月天婷婷一区二区三区久久 | 男女午夜特黄毛片免费 | 国产成在线人视频免费视频 | 啪啪伊人网 | 色噜噜噜| 国产精品久久久久久久久免费hd | 国产产一区二区三区久久毛片国语 | 天天射天天操天天色 |