Paling menghasilkan Pythonic callable Benar?

11

Kelas collections.defaultdictmengambil pabrik default, yang digunakan untuk menghasilkan nilai default.

Jika nilai-nilai yang terkandung dalam objek- dictlike seharusnya default False, instance dapat dibuat sebagai:

d_false = defaultdict(bool)

Apa cara paling pythonic untuk mencapai hal yang sama untuk nilai default True?

Dengan kata lain, apakah ada objek callable standar Trueyang kembali yang secara idiomatis digunakan sebagai kerabat bool?

Tentu saja, pabrik dapat dibangun sebagai ungkapan lambda:

d_true = defaultdict(lambda: True)

tapi ini mungkin menciptakan kembali kemudi.

PiCTo
sumber
6
lambda: Truetidak apa-apa asalkan Anda tidak perlu acar defaultdict itu.
Aran-Fey
Hmm, saya pikir semua jenis builtin konstruktor mengembalikan nilai falsy: int() == 0, list() == [], str() == '', dll Jadi saya tidak berpikir ada cara standar untuk melakukan hal ini.
wjandrea
2
The lambda: valuekonstruk adalah cara idiomatik Pythonic untuk membangun dict dengan nilai default statis; Saya tahu tidak ada cara sederhana untuk mendapatkan fungsi kembali True.
Mark Reed
Mengikuti komentar saya sebelumnya, ternyata object()benar - tidak yakin apakah itu berguna
wjandrea

Jawaban:

9

Nah, Anda bisa melakukannya

d = defaultdict(True.__bool__)

tapi saya pribadi akan pergi dengan lambda: True.

Andrej Kesely
sumber
4
Seperti @ Aran-Frey katakan di atas, Anda tidak dapat picklemenetapkan default dengan lambda; jadi jika itu pertimbangan, True.__bool__adalah jalan yang harus ditempuh. Tapi itu jelas merupakan solusi yang lebih buruk. (Juga, tidak tersedia dalam Python 2.x, yang mungkin tidak terlalu menjadi masalah hanya dengan satu bulan sampai EOL ...)
Mark Reed
4

Kita bisa menggunakan partialsebagai alternatif untuk lambda:

from functools import partial
from collections import defaultdict

d_true = defaultdict(partial(bool, True))

print(d_true['bona fide'])

(Yang juga ramah Python 2.)

cdlane
sumber
3

Jika Anda hanya menginginkan nilai "kebenaran", Anda bisa menggunakan object; konstruktor yang mengembalikan objek yang dievaluasi sebagai benar dalam konteks boolean. Tetapi jika Anda ingin nilai boolean yang sebenarnya True, saya tidak tahu cara yang lebih baik daripada lambda: Truemembangun.

Seperti yang dikatakan Aran-Frey di atas, Anda tidak dapat picklemenetapkan defaultdict yang pabriknya adalah lambda; jika itu pertimbangan, saya akan pergi dengan solusi Andrej Kesely True.__bool__.

Mark Reed
sumber