ไพเราะมากที่สุด callable สร้าง True?


11

ชั้นcollections.defaultdictใช้โรงงานเริ่มต้นที่ใช้ในการสร้างค่าเริ่มต้น

หากค่าที่มีอยู่ในdictวัตถุเหมือนจะเริ่มต้นFalseเช่นสามารถสร้าง:

d_false = defaultdict(bool)

เป็นวิธี pythonic มากที่สุดในการบรรลุเหมือนกันสำหรับค่าเริ่มต้นTrueคืออะไร?

ในแง่อื่น ๆ จะมีวัตถุ callable มาตรฐานกลับTrueซึ่งจะใช้ idiomatically เป็นญาติของbool?

แน่นอนว่าโรงงานสามารถสร้างเป็นรูปแลมบ์ดาได้:

d_true = defaultdict(lambda: True)

แต่นี่อาจเป็นการพลิกโฉมพวงมาลัย


6
lambda: Trueใช้ได้ตราบใดที่คุณไม่จำเป็นต้องดองคำสั่งเริ่มต้นนั้น
Aran-Fey

อืมผมคิดว่าทั้งหมดที่ก่อสร้างประเภท builtin กลับค่า falsy: int() == 0, list() == [], str() == ''ฯลฯ ดังนั้นผมจึงไม่คิดว่ามีวิธีมาตรฐานในการทำเช่นนี้
wjandrea

2
การlambda: valueสร้างเป็นวิธีสำนวนโวหารเพื่อสร้าง dict ที่มีค่าเริ่มต้นคงที่; Trueฉันรู้ว่าไม่มีวิธีที่ง่ายที่จะได้รับฟังก์ชั่นกลับมา
Mark Reed


ต่อไปนี้ความคิดเห็นก่อนหน้าของฉันกลายobject()เป็นจริง - ไม่แน่ใจว่าเป็นประโยชน์
wjandrea

คำตอบ:


9

คุณสามารถทำได้

d = defaultdict(True.__bool__)

lambda: Trueแต่ผมเองจะไปกับ


4
ดังที่ @ Aran-Frey กล่าวไว้ข้างต้นคุณไม่สามารถกำหนดpickleค่าเริ่มต้นด้วยแลมบ์ดาได้ ดังนั้นหากเป็นการพิจารณาTrue.__bool__ก็เป็นหนทางไป แต่มันเป็นทางออกที่น่าเกลียดแน่นอน (นอกจากนี้ยังไม่มีให้บริการใน Python 2.x ซึ่งอาจไม่สำคัญมากนักเพียงหนึ่งเดือนจนกว่า EOL ... )
Mark Reed

4

เราสามารถใช้partialเป็นทางเลือกในการlambda:

from functools import partial
from collections import defaultdict

d_true = defaultdict(partial(bool, True))

print(d_true['bona fide'])

(ซึ่งเป็นมิตรกับ Python 2 ด้วย)


3

หากคุณเพียงต้องการค่า "ความจริง" คุณสามารถใช้object; ตัวสร้างนั้นส่งคืนวัตถุที่ประเมินว่าเป็นจริงในบริบทบูลีน แต่ถ้าคุณต้องการค่าบูลีนที่แท้จริงTrueฉันไม่รู้วิธีที่ดีกว่าlambda: Trueสร้าง

ดังที่ Aran-Frey กล่าวไว้ข้างต้น แต่คุณไม่สามารถกำหนดpickleค่าเริ่มต้นที่โรงงานเป็นlambda; ถ้านั่นคือการพิจารณาผมจะไปกับการแก้ปัญหา Andrej Kesely True.__bool__ของ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.