Самый питонируемый вызывающий призыв Истинный?

11

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

Если значения, содержащиеся в dictобъекте -like, должны иметь значение по умолчанию False, экземпляр может быть создан как:

d_false = defaultdict(bool)

Какой самый питонный способ добиться того же для значения по умолчанию True?

Другими словами, есть ли возвращаемый стандартный вызываемый объект, Trueкоторый идиоматически используется как относительное значение bool?

Конечно, фабрика может быть построена как лямбда-выражение:

d_true = defaultdict(lambda: True)

но это может быть изобретением колеса.

Пиктограмма
источник
6
lambda: Trueэто хорошо, если вам не нужно мариновать этот defaultdict.
Аран-Фей
Хм, я думаю , что все конструкторы типа встроенного возвращают falsy значение: int() == 0, list() == [], str() == ''и т.д. Так что я не думаю , что есть стандартный способ сделать это.
19
2
lambda: valueКонструкция является идиоматическим Pythonic способом построить Dict со статическим значением по умолчанию; Я не знаю более простого способа вернуть функцию True.
Марк Рид
После моего предыдущего комментария оказывается object()правдивым - не уверен, что это полезно
wjandrea

Ответы:

9

Ну, вы можете сделать

d = defaultdict(True.__bool__)

но я лично пошел бы с lambda: True.

Андрей Кеселый
источник
4
Как сказал выше @ Aran-Frey, нельзя 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.)

cdlane
источник
3

Если вы просто хотите получить «истинное» значение, вы можете использовать object; этот конструктор возвращает объект, который оценивается как истинный в логическом контексте. Но если вы хотите фактическое логическое значение True, я не знаю лучшего способа, чем lambda: Trueконструкция.

Как сказал Аран-Фрей выше, вы не можете pickleпо умолчанию считать, чья фабрика является lambda; если это соображение, я бы пошел с решением Андрея Кеселия True.__bool__.

Марк Рид
источник