Більшість пітонічних дзвінків, що породжують правду?


11

Клас collections.defaultdictприймає фабрику за замовчуванням, яка використовується для генерування значення за замовчуванням.

Якщо значення, що містяться в dictоб'єкті -like, мають бути за замовчуванням False, екземпляр може бути створений у вигляді:

d_false = defaultdict(bool)

Що є найбільш пітонічним способом досягти того ж за значенням за замовчуванням True?

Іншими словами, чи є стандартний повертається об'єкт, Trueщо викликається, який ідіоматично використовується як родич bool?

Звичайно, фабрика може бути побудована як лямбда-вираз:

d_true = defaultdict(lambda: True)

але це може бути переосмисленням колеса.


6
lambda: Trueдобре, доки вам не потрібно підбирати цей вирок за замовчуванням.
Аран-Фей

Хм, я думаю , що все конструктори типу вбудованого повертають falsy значення: int() == 0, list() == [], str() == ''і т.д. Так що я не думаю , що є стандартний спосіб зробити це.
wjandrea

2
lambda: valueКонструкція є идиоматическим Pythonic способом побудувати Dict зі статичним значенням за замовчуванням; Я не знаю простішого способу повернути функцію True.
Марк Рід


Після мого попереднього коментаря, виявляється, object()правдоподібний - не впевнений, чи корисно це
wjandrea

Відповіді:


9

Що ж, можна зробити

d = defaultdict(True.__bool__)

але я особисто пішов би зі своїм lambda: True.


4
Як @ Аран-Фрей сказав вище, ви не pickleможете засудитись за лямбдаю за замовчуванням; тож якщо це врахування, True.__bool__це шлях. Але це, безумовно, потворніше рішення. (Крім того, недоступний у Python 2.x, що, мабуть, не має великого значення лише за місяць, поки не піде EOL ...)
Марк Рід

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

Якщо ви просто хочете значення "truthy", ви можете використовувати object; цей конструктор повертає об'єкт, який оцінюється як істинний у булевому контексті. Але якщо ви хочете фактичного булевого значення True, я не знаю кращого способу, ніж lambda: Trueконструкція.

Як сказано вище Аран-Фрей, ви не pickleможете винести рішення за замовчуванням, фабрикою якого є lambda; якби це було врахуванням, я б пішов з рішенням Андрія Кеселі True.__bool__.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.