日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

Python 中,沒有可以在運行時簡化函數(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 都可以完成工作,但是查看實際的源代碼,則會揭示出關(guān)于數(shù)據(jù)類型的更多細節(jié)。

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

1. code

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

2. globals

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

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

3. name(可選)

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

4. argdefs(可選)

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

5. closure(可選)

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

一個cell 對象的元組。創(chuàng)建 cell 對象并非完全是直截了當?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)用。

結(jié)尾

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

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

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

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

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

編輯:hfy

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

    關(guān)注

    58

    文章

    4889

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    使用LTspice定義電壓源和電流源的分段線性函數(shù)

    分段線性(PWL)函數(shù)是一系列直線段,可用于在LTspice中創(chuàng)建電壓或電流波形。PWL段通過時間/數(shù)值對進行定義,是瞬態(tài)仿真中用于描述電壓或電流波形的眾多方式之一。
    的頭像 發(fā)表于 04-14 10:21 ?164次閱讀
    使用LTspice<b class='flag-5'>定義</b>電壓源和電流源的分段線性<b class='flag-5'>函數(shù)</b>

    使用Python/MyHDL創(chuàng)建自定義FPGA IP

    使用 Python/MyHDL 創(chuàng)建自定義 FPGA IP,與 Vivado 集成,并通過 PYNQ 進行控制——實現(xiàn)軟件上的簡單硬件設(shè)計。
    的頭像 發(fā)表于 04-09 09:53 ?286次閱讀
    使用<b class='flag-5'>Python</b>/MyHDL創(chuàng)建自<b class='flag-5'>定義</b>FPGA IP

    使用PYTHON進行的跨平臺仿真

    快速物理光學(xué)軟件VirtualLab Fusion以其“連接場求解器”方法而自豪,該方法將應(yīng)用于不同組件上的專用電磁場求解器結(jié)合在一起,以實現(xiàn)整個系統(tǒng)的物理光學(xué)模擬。這種方法的邏輯擴展不僅是連接軟件
    發(fā)表于 04-02 08:21

    [VirtualLab] 使用Python運行VirtualLab Fusion光學(xué)仿真

    Python編輯器的用戶: 請安裝保存在文件requirements.txt中的所有軟件包。最常見的方法之一是pip安裝: pip install -r requirements.txt 配置路徑 在VirtualLab Fusion中定義光學(xué)系統(tǒng) 查看完整案例: 光
    發(fā)表于 03-31 09:39

    [VirtualLab] 使用Python進行跨平臺參數(shù)掃描

    ** 準備Python **配置路徑 ** **在VirtualLab Fusion中定義一個光學(xué)設(shè)置 ** **保存光學(xué)設(shè)置并導(dǎo)出參數(shù)到一個XML文件 ** **運行模擬 ** 參數(shù)掃描——改變單個參數(shù)
    發(fā)表于 03-31 09:36

    Python運行本地Web服務(wù)并實現(xiàn)遠程訪問

    本文介紹使用Python搭建本地Web服務(wù)并結(jié)合 ZeroNews 實現(xiàn)公網(wǎng)訪問。
    的頭像 發(fā)表于 02-06 11:39 ?371次閱讀
    <b class='flag-5'>Python</b>運行本地Web服務(wù)并<b class='flag-5'>實現(xiàn)</b>遠程訪問

    keil定義fputc函數(shù)

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

    matlab調(diào)用dll動態(tài)函數(shù),死機問題,如何強行跳出?

    matlab調(diào)用dll動態(tài)庫中的函數(shù),例如圖莫斯,發(fā)送數(shù)據(jù)時,經(jīng)常會卡死,是否有辦法限制時間,比如3秒,沒有回應(yīng),就強行結(jié)束函數(shù)調(diào)用。執(zhí)行后續(xù)邏輯。
    發(fā)表于 12-31 10:14

    在Termux環(huán)境下實現(xiàn)康威生命游戲

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

    Python調(diào)用API教程

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

    riscv實現(xiàn)定義指令并用qemu運行

    人根據(jù)語法規(guī)則寫了一個通用的python腳本來生產(chǎn)對應(yīng)指令解析函數(shù),這也是非常值得學(xué)習。qemu是通過指令集解析的,目前只需在decodetree中增加一條cube指令的實現(xiàn)即可。 在target
    發(fā)表于 10-31 07:37

    計算程序執(zhí)行指令數(shù)的函數(shù)實現(xiàn)

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

    CherryUSB怎樣實現(xiàn)U盤動態(tài)加載?

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

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

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

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

    你好,我正在嘗試編寫自己的自定義設(shè)置回調(diào)函數(shù),并使用 fastEnum=false。 是否有任何代碼示例或資料可供我參考? void CyU3PUsbRegisterSetupCallback
    發(fā)表于 05-21 06:11
    永顺县| 石门县| 革吉县| 芒康县| 调兵山市| 渝中区| 临清市| 清流县| 满洲里市| 承德县| 定结县| 伊川县| 涿州市| 贺州市| 霍林郭勒市| 邢台市| 济阳县| 囊谦县| 老河口市| 通许县| 泸州市| 临漳县| 东至县| 衡南县| 资中县| 江口县| 康保县| 桦甸市| 三河市| 平谷区| 南皮县| 西乌| 察隅县| 博客| 绥滨县| 深水埗区| 寿宁县| 巴林右旗| 清水县| 金塔县| 武鸣县|