精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

    文章

    4782

    瀏覽量

    84460
收藏 人收藏

    評論

    相關推薦

    Python常用函數大全

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

    如何實現Python復制文件操作

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

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

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

    ESP32下如何加自定義Python庫?

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

    PHP用戶定義函數詳細講解

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

    output函數怎么用

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

    內聯函數定義 為什么需要內聯函數

    inline關鍵字是C99標準的型關鍵字,其作用是將函數展開,把函數的代碼復制到每一個調用處。
    的頭像 發表于 02-19 12:20 ?517次閱讀

    傳遞函數定義是什么 傳遞函數的拉氏反變換是什么響應

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

    python中open函數的用法詳解

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

    split在python中的用法

    split在python中的用法 split()是Python中一個非常常用的字符串函數,它能夠根據指定的分隔符將一個字符串分割成多個子字符串,并返回一個包含這些子字符串的列表。本文將詳細介紹
    的頭像 發表于 12-25 15:12 ?1969次閱讀

    如何給C語言中的函數定義兩個不同的名字?

    最近有位哥問我,如何給C語言中的函數定義兩個不同的名字?就是這兩個名字都是指向同一個函數,同一個地址,而且兩個名字都可以當做函數來用的那種。
    的頭像 發表于 12-19 16:21 ?763次閱讀

    python如果不符合條件重新輸入怎么辦

    。下面將詳細介紹在 Python 中如何實現這一功能。 首先,我們需要定義一個函數來驗證用戶的輸入是否符合預期的條件。例如,我們可以編寫一個函數
    的頭像 發表于 11-29 16:56 ?1951次閱讀

    python中計算排列組合的函數有哪些

    Python中,有多種可以用于計算排列組合的函數和模塊。下面將詳細介紹一些常用的函數和模塊,并提供詳實和細致的說明。 math模塊: Python的math模塊提供了一些計算排列組合
    的頭像 發表于 11-29 16:33 ?3488次閱讀

    python將abc按大小順序輸出不用函數

    將'abc'按照大小順序輸出是一個常見的編程問題。在Python中,有多種方法可以實現這個目標。本文將詳盡、詳實、細致地介紹幾種不使用函數的方法,以幫助您更好地理解問題以及解決方法。 方法一
    的頭像 發表于 11-29 16:25 ?2957次閱讀

    不屬于python的內置函數

    Python是一種高級編程語言,它提供了許多內置函數,可以幫助開發人員更輕松地處理各種任務。但是,在Python中并非所有的函數都是內置函數
    的頭像 發表于 11-29 14:27 ?1401次閱讀