最pythonic可调用生成真吗?


11

班级 collections.defaultdict采用默认工厂,用于生成默认值。

如果dict-like对象中包含的值应默认为False,则可以按以下方式创建实例:

d_false = defaultdict(bool)

对于默认值,达到相同效果的最pythonic方法是什么 True什么?

换句话说,是否有标准的可调用对象返回 True,习惯上将其用作的相对bool

当然,工厂可以构建为lambda表达式:

d_true = defaultdict(lambda: True)

但这可能是在重新发明轮子。


6
lambda: True只要您不需要使该defaultdict腌制就可以。
阿兰·费伊,

嗯,我认为所有的内置类型构造函数返回一个值falsy: ,,int() == 0 等,所以我不认为有这样做的标准方式。list() == []str() == ''
wjandrea

2
lambda: value构建体是惯用Python的方式来构建了静态缺省值的字典; 我知道没有简单的方法可以使函数返回True
马克·里德


按照我之前的评论,结果object()是真实的 -不确定是否有用
wjandrea

Answers:


9

好吧,你可以做

d = defaultdict(True.__bool__)

但我个人会同意的lambda: True


4
正如@ Aran-Frey所说,您不能pickle使用lambda作为默认值;因此,如果这是一个考虑因素,那True.__bool__是要走的路。但这绝对是一个难看的解决方案。(此外,在Python 2.x中不可用,可能只有一个月才停产,直到停产为止……)
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的对象。但是,如果您想要实际的布尔值True,我不知道有什么比lambda: True构造更好的方法。

但是,正如Aran-Frey所说,您不能pickle将其工厂设置为lambda;如果考虑到这一点,我会选择Andrej Kesely的解决方案True.__bool__

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.