色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

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

454398 ? 來(lái)源:Python貓 ? 作者:Philip Trauner ? 2020-11-19 15:42 ? 次閱讀

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

Python 中,沒(méi)有可以在運(yùn)行時(shí)簡(jiǎn)化函數(shù)定義的語(yǔ)法糖。然而,這并不意味著它就不可能,或者是難以實(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)語(yǔ)言/解釋器的屏障是多么脆弱。

>>> from types import FunctionType

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

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

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

1. code

內(nèi)部是一個(gè)PyCodeobject,作為types.CodeType對(duì)外開(kāi)放。非內(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ù)值提供、或者通過(guò)閉包上下文提供,則它會(huì)在 globals 字典中查找。

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

3. name(可選)

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

4. argdefs(可選)

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

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

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

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

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

>>> 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í)這門(mén)語(yǔ)言的好方法。

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

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

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

編輯:hfy

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

    關(guān)注

    56

    文章

    4800

    瀏覽量

    84835
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

    Python常用函數(shù)大全

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

    如何實(shí)現(xiàn)Python復(fù)制文件操作

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

    python函數(shù)的萬(wàn)能參數(shù)

    我們通過(guò)一個(gè)簡(jiǎn)單的事例來(lái)展示一下函數(shù)的萬(wàn)能參數(shù),我們先寫(xiě)一個(gè)最簡(jiǎn)單的函數(shù)
    的頭像 發(fā)表于 07-17 14:56 ?358次閱讀
    <b class='flag-5'>python</b><b class='flag-5'>函數(shù)</b>的萬(wàn)能參數(shù)

    神經(jīng)網(wǎng)絡(luò)中激活函數(shù)定義及類(lèi)型

    詳細(xì)介紹激活函數(shù)定義、類(lèi)型。 激活函數(shù)定義和基本功能 2.1 定義 激活函數(shù)(Activat
    的頭像 發(fā)表于 07-02 10:09 ?580次閱讀

    ESP32下如何加自定義Python庫(kù)?

    我看官方有提供Micropython的bin文件,但我想根據(jù)自己外設(shè)擴(kuò)充一下Python庫(kù),這個(gè)應(yīng)該從哪里入手? 之前做過(guò)RTT系統(tǒng)的python庫(kù)擴(kuò)充,RTT有提供Micropython的源代碼,直接在里面加自己的庫(kù)就行 ESP32下如何加自
    發(fā)表于 06-18 06:27

    函數(shù)信號(hào)發(fā)生器的定義、功能及應(yīng)用

    隨著現(xiàn)代電子技術(shù)的飛速發(fā)展,電子測(cè)試設(shè)備在科研、生產(chǎn)、教育等領(lǐng)域的應(yīng)用越來(lái)越廣泛。其中,函數(shù)信號(hào)發(fā)生器作為一種重要的電子測(cè)試設(shè)備,在電子工程、通信、科研等領(lǐng)域發(fā)揮著至關(guān)重要的作用。本文將詳細(xì)介紹函數(shù)信號(hào)發(fā)生器的定義、分類(lèi)、功能、
    的頭像 發(fā)表于 05-15 14:42 ?1832次閱讀

    PHP用戶定義函數(shù)詳細(xì)講解

    還可以根據(jù)需要定義函數(shù)。這些稱(chēng)為“用戶定義函數(shù)”。 ? 句法: function function-name() ?{ ? ? statement 1 : ? ? statement
    的頭像 發(fā)表于 03-20 14:27 ?424次閱讀

    淺談C語(yǔ)言中的函數(shù)定義

    如果函數(shù)要使用參數(shù),則必須聲明接受參數(shù)值的變量。這些變量稱(chēng)為函數(shù)的形式參數(shù)。 形式參數(shù)就像函數(shù)內(nèi)的其他局部變量,在進(jìn)入函數(shù)時(shí)被創(chuàng)建,退出函數(shù)
    發(fā)表于 03-11 10:09 ?418次閱讀

    output函數(shù)怎么用

    output 函數(shù)是一個(gè)通用的術(shù)語(yǔ),并不特指某個(gè)具體的編程語(yǔ)言或軟件工具。 如果你在使用 Python 編程語(yǔ)言,那么可能是指 print 函數(shù)Python 中的 print
    的頭像 發(fā)表于 02-23 14:21 ?1282次閱讀

    內(nèi)聯(lián)函數(shù)定義 為什么需要內(nèi)聯(lián)函數(shù)

    inline關(guān)鍵字是C99標(biāo)準(zhǔn)的型關(guān)鍵字,其作用是將函數(shù)展開(kāi),把函數(shù)的代碼復(fù)制到每一個(gè)調(diào)用處。
    的頭像 發(fā)表于 02-19 12:20 ?563次閱讀

    傳遞函數(shù)定義是什么 傳遞函數(shù)的拉氏反變換是什么響應(yīng)

    傳遞函數(shù)定義: 傳遞函數(shù)是一種數(shù)學(xué)工具,用于描述線性時(shí)不變系統(tǒng)(LTI系統(tǒng))的輸入與輸出之間的關(guān)系,通常用H(s)表示。傳遞函數(shù)是Laplace變換的
    的頭像 發(fā)表于 02-01 10:53 ?4697次閱讀

    python中open函數(shù)的用法詳解

    python中open函數(shù)的用法詳解 Python中的open()函數(shù)用于打開(kāi)文件。它接受文件名和模式作為參數(shù),并返回一個(gè)文件對(duì)象。文件對(duì)象可用于讀取、寫(xiě)入和管理文件。 open()
    的頭像 發(fā)表于 01-30 15:31 ?2178次閱讀

    通過(guò)Python腳本實(shí)現(xiàn)WIFI密碼的自動(dòng)猜解

    本文將記錄學(xué)習(xí)下如何通過(guò) Python 腳本實(shí)現(xiàn) WIFI 密碼的自動(dòng)猜解。
    的頭像 發(fā)表于 01-25 10:46 ?3531次閱讀
    通過(guò)<b class='flag-5'>Python</b>腳本<b class='flag-5'>實(shí)現(xiàn)</b>WIFI密碼的自動(dòng)猜解
    主站蜘蛛池模板: 欧美一级久久久久久久久大| 亚洲天堂2017无码| 欧美黑人经典片免费观看| 伦理片在线线249| 蜜柚视频网在线观看免费| 奶头从情趣内衣下露了出来AV| 欧美内射深插日本少妇| 日本视频久久| 小xav导航| 伊人成综合网伊人222| 91免费网站在线看入口黄| WWW国产无套内射久久| 福利视频久久| 國産麻豆AVMDMD0179| 久久无码人妻AV精品一区| 欧美高清video mr.sexo| 色窝窝777欧美午夜精品影院| 亚洲精品高清在线观看| 主播蜜汁丝袜精品自拍| AV久久久囯产果冻传媒| 国产成人在线观看免费网站| 红尘影院在线观看| 男男高h浪荡受h| 色欲久久99精品久久久久久AV| 亚洲成色WWW久久网站夜月| 最近免费中文字幕MV免费高清 | 久久精品久久久| 奶水太多h室友| 思思久99久女女精品| 亚洲性夜夜色综合网站| 99热在线视频这里只精品| 国产精品97久久AV麻豆| 久久re热在线视频精6| 欧美视频 亚洲视频| 亚洲 天堂 国产在线播放| 7723日本高清完整版在线观看| 岛国在线无码免费观| 精品水蜜桃久久久久久久| 亲胸吻胸添奶头GIF动态图免费| 亚洲精品久久YY5099| GAY东北澡堂激情2022|