簡體   English   中英

我怎樣才能在 lambda ZC1C425268E68385D1AB5074F14C1

[英]How can I get the function object inside a lambda function

抱歉,如果這很蹩腳,但我對 Python 還是很陌生。

就像在 Python 中一樣,一切都是 object,我假設在每個 object 中,ZA8CFDE6331BD59EB2AC96F89111C4 本身都可以得到。 在 object 方法中, self變量包含它。 從 object 參考 class object 可以得到(如type(self) )。 但這怎么能在 lambda 中得到呢?

我可以找出一個正常的 function:

import inspect

def named_func():
    func_name = inspect.stack()[0].function
    func_obj = inspect.stack()[1].frame.f_locals[func_name]
    print(func_name, func_obj, func_obj.xxx)

named_func.xxx = 15
named_func()

output 看起來像這樣:

named_func <function named_func at 0x7f56e368c2f0> 15

不幸的是,在 lambda 中, inspect.stack()[0].function在 lambda 中給出了<lambda>

有沒有辦法在 lambda 中獲取 function object ? 有沒有辦法直接獲取function object(不使用函數名)? 我想象__self__ ,但它不起作用。

更新

我在 lambda 中嘗試過這樣的事情:

lambda_func = lambda : inspect.stack()[0]
lambda_func.xxx = 2
print(lambda_func())

這打印:

FrameInfo(frame=<frame at 0x7f3eee8a6378, file './test_obj.py', line 74, code <lambda>>, filename='./test_obj.py', lineno=74, function='<lambda>', code_context=['lambda_func = lambda : inspect.stack()[0]\n'], index=0)

但例如,在這種情況下,有沒有辦法獲得 lambda object 字段xxx 為此,應該以某種方式獲得 lambda object。

所以我想我已經想出了如何以一種非常老套的方式做到這一點。 我相信只有按照我在此處找到的答案中的建議,這才能完全正確地工作

基本上,給定stack ,您可以找到code object,然后使用gc模塊您可以找到對 lambda 的引用。

@Tomalak的階乘 lambda 示例!

import gc
import inspect


def current_lambda():
    lambda_code = inspect.stack()[1].frame.f_code
    lambda_obj = gc.get_referrers(lambda_code)[0]
    return lambda_obj


print((lambda n: 1 if n < 2 else n * current_lambda()(n - 1))(5))

輸出

120

重溫你的例子:

lambda_func = lambda: current_lambda().xxx
lambda_func.xxx = 10
print(lambda_func())

輸出:

10

我們現在可以使用新的 python 語法使其更短且更易於閱讀,而無需為此目的定義新的 function。

您可以在下面找到兩個示例:

斐波那契:

(f:=lambda x: 1 if x <= 1 else f(x - 1) + f(x - 2))(5)

階乘:

(f:=lambda x: 1 if x == 0 else x*f(x - 1))(5)

我們使用:=來命名 lambda:直接在 lambda 本身中使用該名稱,並立即將其稱為匿名 function。

因此,在您的特定用例中,它會給出類似的結果:

print((f:=lambda: f.__hash__())())  # prints the hash for example

你現在可以用那個f變量做任何你想做的事情(在 lambda 內)。

但事實上,如果您不介意代碼多行,您也可以直接使用名稱並執行以下操作:

f = lambda : f.xxx
f.xxx = 2
print(f())

(有關此操作的更多信息,請參見https://www.python.org/dev/peps/pep-0572 :=

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM