Python騷操作 動態定義函式

2021-09-19 20:15:39 字數 2191 閱讀 6837

譯者:豌豆花下貓

基於 mit 許可協議

在 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)

內部是乙個pycodeobject,作為types.codetype對外開放。非內建方法擁有乙個__code__屬性,該屬性儲存了相應的**物件。利用內建的 compile() 方法,可以在執行期建立types.codetype物件。

如果乙個函式引用的變數不是在區域性定義的,而是作為引數轉入、由預設引數值提供、或者通過閉包上下文提供,則它會在 globals 字典中查詢。

內建的 globals() 方法會返回乙個對當前模組的全域性符號表(global symbol table)的引用,因此能被用來提供乙個總是與當前表的狀態相一致的字典。傳入任意其它的字典也是可以的(functiontype((lambda: bar).__code__, , "foo")() == "baz")。

控制所返回的函式的__name__屬性。只真正對 lambdas 有用(由於匿名性,它們通常沒有名稱),並且重新命名函式。

通過傳入乙個包含任意型別的物件的元組,提供了乙個方式來**預設引數值(def foo(bar="baz"))。(functiontype((lambda bar: bar).__code__, {}, "foo", (10,))() == 10)。

(如果需要在 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())
動態生成的函式可以像其它函式一樣被呼叫。

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

--------(譯文完)--------

numpy騷操作函式

1.np.select np.select condlist,choicelist,default 0 condlist引數 運算元據所依據的條件 choicelist引數 根據condlist條件,索要執行的操作 返回值 返回的是乙個 列表 注意上面的condlist和choicelist都必須是...

python的騷操作

1.列表生成。c 1,3,3,4,2,8,7,6 d x for x in c if x 0 print d 執行結果 1,3,4,8,6 還可以在dataframe中計算累計數 mongroups 累計餘額 mongroups.loc 0 x,餘 sum for x in range 0,len ...

這是 format 函式的騷操作???

fomat格式化的一般表示式 待格式化 字串 fomat 逗號分隔的引數 用槽 在待格式化字串中開闢乙個位置,將format函式中的引數填充到槽 中。1 位置傳遞 format函式可以接受不限個引數,位置可以不按順序。format 智慧型 演示 format 智慧型 演示 format 智慧型 演示...