map(lambda k,v: self._value_store.update(k=v) if self.keyword_check(k) == True else print('bad parameter'), kwargs.keys(),kwargs.value)
keyword_check(k)回傳一個布林值,具體取決于它是否在串列中。這樣做的目的是基本上更新每個引數的字典值和傳入的值,kwargs但前提是引數名稱存在于預定義串列中。
我不想使用 for 回圈來解決這個問題。
我的問題是該else引數似乎是強制性的,但我不希望它做任何事情,除非關鍵字驗證回傳True或 時轉到下一個可迭代物件False。我嘗試在 else 子句之后添加 pass,但 Python 不喜歡它。它適用于我放置的內容,else print('bad parameter')但這只是一個臨時解決方案。我可以在這里使用什么來真正做/不輸出什么False?
uj5u.com熱心網友回復:
請注意,這個運算式實際上什么都不做(它與您的相同,除了一些更正,但為了可讀性而分散在幾行中):
map(lambda k,v: self._value_store.update((k,v)) # k=v always sets key 'k'
if self.keyword_check(k) == True
else print('bad parameter'),
kwargs.keys(),
kwargs.values()
)
map回傳一個生成器。只有當您收集生成器的值時,它才會真正執行副作用 ( self._value_store.update)。因此,要讓它實際更新物件的內部值存盤,您需要執行以下操作
list(map(lambda k,v: self._value_store.update((k,v))
if self.keyword_check(k) == True
else print('bad parameter'),
kwargs.keys(),
kwargs.values()
))
(您可以替換listwithall以避免創建無用的Nones串列;all將在這里作業,因為{}.update()總是回傳None,但這可能是更糟糕的編程風格。)
一般來說,map僅用于產生副作用通常不是好的風格,除非您確實需要延遲執行副作用(在這種情況下,需要一些檔案)。
相反,將生成器傳遞給update作為它的第一個引數;update迭代它的第一個引數,所以生成器將被完全評估。此外,運算式更簡單,(我認為)更容易閱讀:
self._value_store.update((k,v) for k,v in kwargs.items()
if self.keyword_check(k))
您可能會發現顯式回圈更具可讀性:
for k, v in kwargs.items():
if self.keyword_check(k):
self._value_store[k] = v
# Or, possibly faster (or possibly not):
for k in kwargs.keys():
if self.keyword_check(k):
self._value_store[k] = kwargs[k]
順便說一下,測驗布爾函式回傳的值是否相等True也是一種反模式(這就是我上面沒有這樣做的原因)。如果謂詞可能回傳除 之外的真值,則可能會忽略通過測驗的值True。
uj5u.com熱心網友回復:
正如其他人已經指出的那樣,您的函式應該始終回傳一個值(我不會爭論這一點)。
但是,也許您想要實作的是:
map(lambda k,v: self.keyword_check(k) and self._value_store.update(k=v), kwargs.keys(),kwargs.value)
請注意,我使用了一個簡單的and運算子,而不是像您一樣使用三元運算子。
在這里,該方法self._value_store.update(k=v)僅在self.keyword_check(k)is 時呼叫True。這就是您所追求的(避免使用 else 子句)。
這要歸功于短路評估:要評估 AND 運算式,如果第一個運算子為 False,則運算式為 False,并且不需要評估第二個運算子。
當然,你要注意的是,如果第一個陳述句 ( self.keyword_check(k)) 是False,那么回傳值將是False它應該的樣子(一個值應該存在)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/373955.html
