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