由於processFunc
必須是功能,而不是調用一個函數的結果。
其實行:
processFunc = collapse and " ".join(s.split()) or s
將引發NameError
因爲s
沒有定義。如果s
被定義,則取決於collapse
是否可以評估爲字符串" ".join(s.split())
或s
。
而行:
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
將評估在功能(lambda s: " ".join(s.split()))
如果collapse
是真實的,還是功能(lambda s: s)
否則。
注意,寫入A and B or C
是有點相當於寫入B if A else C
,儘管它們是不等效 100%,因爲在if
版本僅A
小號布爾值是很重要的,以確定所述表達式的結果,而在其他代碼如果A
爲真,且B
爲假,則結果爲C
。
你真的應該重新寫行:
processFunc = (lambda s: " ".join(s.split())) if collapse else (lambda s: s)
雖然在這種特殊情況下因爲所有lambda
s爲真and
+ or
形式等同。
你甚至可能會與實際功能代替lambda
s到提高可讀性:
def identity(x):
return x
def normalize_spaces(s):
return ' '.join(s.split())
processFunc = normalize_spaces if collapse else identity
非常感謝。:) –