Hầu hết các pythonic có thể tạo ra True?


11

Lớp collections.defaultdictlấy một nhà máy mặc định, được sử dụng để tạo ra một giá trị mặc định.

Nếu các giá trị được chứa trong dictđối tượng giống như mặc định False, thì thể hiện có thể được tạo như sau:

d_false = defaultdict(bool)

Cách pythonic nhất để đạt được cùng một giá trị mặc định là Truegì?

Nói cách khác, có một đối tượng có thể gọi tiêu chuẩn trở lại Trueđược sử dụng một cách thành ngữ như là họ hàng của boolkhông?

Tất nhiên, nhà máy có thể được xây dựng như một biểu thức lambda:

d_true = defaultdict(lambda: True)

nhưng điều này có thể được phát minh lại bánh xe.


6
lambda: Truecũng tốt miễn là bạn không cần phải chọn mặc định đó.
Aran-Fey

Hmm, tôi nghĩ rằng tất cả các nhà thầu xây dựng trong kiểu trả về một giá trị falsy: int() == 0, list() == [], str() == '', vv Vì vậy, tôi không nghĩ rằng có một cách tiêu chuẩn để làm điều này.
wjandrea

2
Cấu lambda: valuetrúc này là cách Pythonic thành ngữ để xây dựng một dict với giá trị mặc định tĩnh; Tôi biết không có cách nào đơn giản hơn để có được một chức năng trở lại True.
Mark Reed


Theo nhận xét trước đó của tôi, hóa ra object()là sự thật - không chắc điều đó có hữu ích không
wjandrea

Câu trả lời:


9

Vâng, bạn có thể làm

d = defaultdict(True.__bool__)

nhưng cá nhân tôi sẽ đi với lambda: True.


4
Như @ Aran-Frey đã nói ở trên, bạn không thể mặc định picklevới lambda; Vì vậy, nếu đó là một sự cân nhắc, True.__bool__là cách để đi. Nhưng đó chắc chắn là một giải pháp xấu hơn. (Ngoài ra, không có sẵn trong Python 2.x, có lẽ không quan trọng lắm chỉ với một tháng cho đến khi nó đi EOL ...)
Mark Reed

4

Chúng tôi có thể sử dụng partialthay thế cho lambda:

from functools import partial
from collections import defaultdict

d_true = defaultdict(partial(bool, True))

print(d_true['bona fide'])

(Đó cũng là Python 2 thân thiện.)


3

Nếu bạn chỉ muốn một giá trị "trung thực", bạn có thể sử dụng object; hàm tạo đó trả về một đối tượng được đánh giá là đúng trong bối cảnh boolean. Nhưng nếu bạn muốn giá trị boolean thực tế True, tôi không biết cách nào tốt hơn lambda: Truecấu trúc.

Tuy nhiên, như Aran-Frey đã nói ở trên, bạn không thể picklelà một mặc định có nhà máy là một lambda; nếu đó là một sự cân nhắc, tôi sẽ đi với giải pháp của Andrej Kesely True.__bool__.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.