簡體   English   中英

python中的空函數對象

[英]empty function object in python

我聽說python函數是對象,類似於列表或字典等。但是,使用函數執行此類操作的類似方法是什么?

# Assigning empty list to 'a'
a = list()

# Assigning empty function to 'a'
a = lambda: pass
# ???

你會怎么做? 此外,是否必要或適當? 以下是我想將其用於更好的上下文的意義:

我有一個QListWidget用於選擇與字典中的鍵相關聯的項目。 此字典中的值也是字典,它包含項目的某些屬性,我可以添加。 這些特定屬性存儲為鍵,並通過調用不同的函數初始化或更新它們中的值。 所以,我在窗口中存儲一個變量,當按下一個按鈕告訴該腳本要更新哪個屬性時,該變量會更新。

如您所見,我想根據情況使用正確的函數存儲函數以映射到數據。

# Get selection from the list
name = selected_item
# Initialize an empty function
f = lambda: pass
# Use property that is being added now, which was updated by the specific button that was pushed
property_list = items[name][self.property_currently_being_added]
if self.property_currently_being_added == "prop1":
    f = make_property1()
elif self.property_currently_being_added == "prop2":
    f = make_property2()
elif self.property_currently_being_added == "prop3":
    f = make_property3()
elif self.property_currently_being_added == "prop4":
    f = make_property4()

# map the certain function to the data which was retrieved earlier
added_property = map(f, data)
property_list.append(added_property)

首先,這不起作用的原因:

a = lamdba: pass

...是lambda只允許表達式,並定義一個返回表達式值的函數。 由於pass是聲明而不是表達式,因此這是非法的。

但是,這很好用:

a = lambda: None

在Python中,一個沒有return語句的函數總是返回None 所以,這些是等價的:

def a(): return None
def a(): pass

但是,我不明白你為什么要把它寫成一個lambda和一個任務; def較短,更易讀的,並給出了你一個好聽的名字的內省功能對象( a ,而不是<lambda> ),等等。 使用lambda的唯一原因是當你不想給函數命名時,或者你需要在表達式中定義函數時。 顯然這兩者都不正確,因為你直接在賦值語句中使用lambda 所以,只需使用def


同時,這在某種意義上是一個“空函數”,或者至少盡可能為空(正如你可以看到的那樣,例如,調用dis.dis(a) ,它仍然需要兩個字節代碼才能做什么,但是從最后掉下來並返回None ),但它對你的情況沒用。 你不想要一個“空函數”。 如果你嘗試將a傳遞給map ,那么你只會得到一個TypeError ,因為你試圖用一個參數調用一個沒有參數的函數。 (因為這就是map所做的。)

你可能想要的是一個身份函數,它只是按原樣返回它的參數。 像這樣:

def a(x): return x

但我不確定那是你想要的。 在這種情況下,您是否要按原樣附加data 或者你想做一些不同的事情,比如早退,或提出異常,或不附加任何東西,或......?


最后,我不明白為什么你想要一個功能。 為什么不干脆不叫map ,如果你有什么地圖? 你有一個非常好的else條款已經捕獲了這種情況(如果你想做的事情是提前返回或提高......),這是非常方便的。 或者,如果您願意,可以從f = None開始,然后使用if f:確定是否映射。 或者,如果你真的想要:

added_property = [f(element) if f else element for element in data]

… 要么 …

added_property = map(f, data) if f else data

作為最后一個注釋,你可能想要一個dict ,而不是一遍又一遍地重復同一個東西的if / elif鏈。

propfuncs = {'prop1': make_property1(),
             'prop2': make_property2(),
             'prop3': make_property3(),
             'prop4': make_property4()}

然后,所有這些殘余變成了這兩行:

f = propfuncs.get(self.property_currently_being_added)
added_property = map(f, data) if f else data

或者更好的設計可能是將所有make_propertyN函數替換為您調用為make_property(1)make_property('prop1')的單個函數...但是沒有看到它們實際執行的操作,我無法確定。

我很驚訝你甚至可以做到......

def a(): "This is a test"

a()

這感覺非常像你正在尋找一個Nothing functor,我猜你如果你對Monads有所了解,你甚至不需要一個空函數,因為靈感PyMonad有一個很好的Nothing實現,我通常喜歡創建我自己的,但這是一個很好的起點。

為了完整性,由於標題是“python中的空函數對象”,更一般的情況是一個空函數對象,它接受任意數量的參數 ,因此您可以在任何回調中使用它。 就是這個:

callback = lambda *_, **__: None

解釋如下: http//echochamber.me/viewtopic.php?t = 64825

暫無
暫無

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

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