99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python動(dòng)態(tài)定義函數(shù)實(shí)現(xiàn)

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

掃碼添加小助手

加入工程師交流群

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

Python 中,沒有可以在運(yùn)行時(shí)簡(jiǎ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

剖析

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

>>> from types import FunctionType

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

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

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

1. code

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

2. globals

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

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

3. name(可選)

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

4. argdefs(可選)

通過傳入一個(gè)包含任意類型的對(duì)象的元組,提供一個(gè)方式來供應(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)樗鼑?yán)重地依賴于實(shí)現(xiàn)細(xì)節(jié))。

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

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

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

exec 模式被用到,因?yàn)槎x函數(shù)需用多個(gè)語句。

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

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

那個(gè)被前一句代碼編譯成的函數(shù),成為了生成的代碼對(duì)象的第一個(gè)常量,因此僅僅指向 foo_code 是不充分的。這是 exec 模式的直接后果,因?yàn)樯傻拇a對(duì)象可以包含多個(gè)常量。

>>> print(foo_func())

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

結(jié)尾

除了做實(shí)驗(yàn),需要用到動(dòng)態(tài)創(chuàng)建函數(shù)的場(chǎng)景很少。

玩耍(Toying around) Python 的內(nèi)部構(gòu)件是一種深入學(xué)習(xí)這門語言的好方法。

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

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

譯者簡(jiǎn)介: 豌豆花下貓,生于廣東畢業(yè)于武大,現(xiàn)為蘇漂程序員,有一些極客思維,也有一些人文情懷,有一些溫度,還有一些態(tài)度。

編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4827

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何使用自定義設(shè)置回調(diào)函數(shù)?

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

    函數(shù)指針的六個(gè)常見應(yīng)用場(chǎng)景

    函數(shù)指針在嵌入式開發(fā)中有著廣泛的應(yīng)用,它讓代碼更加靈活,減少冗余,提高可擴(kuò)展性。很多時(shí)候,我們需要根據(jù)不同的情況動(dòng)態(tài)調(diào)用不同的函數(shù),而函數(shù)指針正是實(shí)
    的頭像 發(fā)表于 04-07 11:58 ?548次閱讀
    <b class='flag-5'>函數(shù)</b>指針的六個(gè)常見應(yīng)用場(chǎng)景

    詳解RTOS中的Hook函數(shù)

    Hook函數(shù)是RTOS中的一個(gè)關(guān)鍵特性,通過該函數(shù),用戶可以增強(qiáng)對(duì)任務(wù)管理的控制,定義系統(tǒng)行為。
    的頭像 發(fā)表于 03-24 16:14 ?397次閱讀

    使用Python API在OpenVINO?中創(chuàng)建了用于異步推理的自定義代碼,輸出張量的打印結(jié)果會(huì)重復(fù),為什么?

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

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

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

    運(yùn)行OVModelForCausalLM Python模塊時(shí)出錯(cuò)了,怎么解決?

    創(chuàng)建了一個(gè)自定義 Python* 代碼,類似于遵循 240-dolly-2-instruction 的 Jupyter 筆記本。 OVModelForCausalLM Python* 模塊運(yùn)行時(shí)出錯(cuò)。
    發(fā)表于 03-05 06:44

    在D4100_usb.dll動(dòng)態(tài)庫中應(yīng)該使用哪些相關(guān)的函數(shù)才能實(shí)現(xiàn)Activex中的MemToFrameBuffer(),LoadToDMD() 功能?

    使用Activex時(shí)可以正常讀取圖片并顯示。但當(dāng)使用D4100_usb.dll動(dòng)態(tài)庫時(shí),不清楚怎樣才能將數(shù)據(jù)顯示到DMD。 請(qǐng)問在D4100_usb.dll動(dòng)態(tài)庫中應(yīng)該使用哪些相關(guān)的函數(shù)才能
    發(fā)表于 02-28 06:17

    如何使用Python API創(chuàng)建自定義函數(shù)

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

    深度學(xué)習(xí)入門:簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)的構(gòu)建與實(shí)現(xiàn)

    神經(jīng)網(wǎng)絡(luò)。 首先,導(dǎo)入必要的庫: 收起 python ? import numpy as np ? 定義激活函數(shù) Sigmoid: 收起 python ? def sigmoid(x)
    的頭像 發(fā)表于 01-23 13:52 ?534次閱讀

    使用Python實(shí)現(xiàn)xgboost教程

    使用Python實(shí)現(xiàn)XGBoost模型通常涉及以下幾個(gè)步驟:數(shù)據(jù)準(zhǔn)備、模型訓(xùn)練、模型評(píng)估和模型預(yù)測(cè)。以下是一個(gè)詳細(xì)的教程,指導(dǎo)你如何在Python中使用XGBoost。 1. 安裝XGBoost
    的頭像 發(fā)表于 01-19 11:21 ?1386次閱讀

    stdio.h實(shí)現(xiàn)了printf函數(shù)?

    我們平時(shí)包含的 stdio.h 頭文件,里面是不是實(shí)現(xiàn)了 printf 函數(shù)? 為什么會(huì)有這個(gè)疑問?因?yàn)槊看问褂?printf,就得包含 stdio.h ,這就導(dǎo)致很多同學(xué)誤以為,stdio.h
    的頭像 發(fā)表于 12-18 10:28 ?620次閱讀

    使用C語言實(shí)現(xiàn)函數(shù)模板

      用C語言能不能實(shí)現(xiàn)一個(gè)通用的函數(shù),既能完成整數(shù)的相加,又能完成浮點(diǎn)數(shù)的相加?
    的頭像 發(fā)表于 11-09 11:38 ?956次閱讀

    SUMIF函數(shù)與SUMIFS函數(shù)的區(qū)別

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

    Python常用函數(shù)大全

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

    Python建模算法與應(yīng)用

    Python作為一種功能強(qiáng)大、免費(fèi)、開源且面向?qū)ο蟮木幊陶Z言,在科學(xué)計(jì)算、數(shù)學(xué)建模、數(shù)據(jù)分析等領(lǐng)域展現(xiàn)出了卓越的性能。其簡(jiǎn)潔的語法、對(duì)動(dòng)態(tài)輸入的支持以及解釋性語言的本質(zhì),使得Python在多個(gè)平臺(tái)
    的頭像 發(fā)表于 07-24 10:41 ?1274次閱讀