अधिकांश पायथोनिक कॉलेबल जेनरेटिंग ट्रू?


11

क्लास collections.defaultdictएक डिफॉल्ट फैक्ट्री लेता है, जिसका इस्तेमाल डिफॉल्ट वैल्यू जेनरेट करने के लिए किया जाता है।

अगर dict-जैसे ऑब्जेक्ट में निहित मानों को डिफ़ॉल्ट होना चाहिए False, तो उदाहरण के रूप में बनाया जा सकता है:

d_false = defaultdict(bool)

डिफ़ॉल्ट मान के लिए समान प्राप्त करने का सबसे पैथोनिक तरीका क्या है True?

अन्य शब्दों में, क्या कोई मानक कॉल करने योग्य वस्तु वापस आ रही है Trueजिसे मुहावरेदार रूप से रिश्तेदार के रूप में उपयोग किया जाता है bool?

बेशक, कारखाने को मेमने की अभिव्यक्ति के रूप में बनाया जा सकता है:

d_true = defaultdict(lambda: True)

लेकिन यह पहिया को फिर से मजबूत कर सकता है।


6
lambda: Trueतब तक ठीक है जब तक आपको उस डिफॉल्ट को अचार बनाने की आवश्यकता नहीं है।
अरन-

हम्म, मुझे लगता है कि सभी builtin प्रकार कंस्ट्रक्टर्स एक falsy मान: int() == 0, list() == [], str() == '', आदि तो मैं वहाँ यह करने के लिए एक मानक तरीका है नहीं लगता।
वेजेंड्रिया

2
lambda: valueनिर्माण मुहावरेदार pythonic तरीका एक स्थिर डिफ़ॉल्ट मान के साथ एक dict निर्माण करने के लिए है, मुझे पता है कि फ़ंक्शन वापस करने का कोई सरल तरीका नहीं है True
मार्क रीड रीड


मेरे पहले टिप्पणी के बाद, पता चला है object()truthy है - नहीं यकीन है कि अगर है उपयोगी
wjandrea

जवाबों:


9

खैर, आप कर सकते हैं

d = defaultdict(True.__bool__)

लेकिन मैं व्यक्तिगत रूप से साथ जाना होगा lambda: True


4
जैसा कि @ अरण-फ्रे ने ऊपर कहा, आप pickleलंबोदर के साथ कोई चूक नहीं कर सकते ; तो अगर यह एक विचार है, True.__bool__जाने का रास्ता है। लेकिन यह निश्चित रूप से एक बदसूरत समाधान है। (इसके अलावा, पायथन 2.x में उपलब्ध नहीं है, जो शायद केवल एक महीने तक ज्यादा मायने नहीं रखता है जब तक कि यह ईओएल नहीं जाता है ...)
मार्क रीड रीड

4

हम इसके partialविकल्प के रूप में उपयोग कर सकते हैं lambda:

from functools import partial
from collections import defaultdict

d_true = defaultdict(partial(bool, True))

print(d_true['bona fide'])

(जो कि पायथन 2 के अनुकूल भी है।)


3

यदि आप केवल "सत्य" मूल्य चाहते हैं, तो आप उपयोग कर सकते हैं object; वह निर्माणकर्ता एक वस्तु देता है जो एक बूलियन संदर्भ में सच के रूप में मूल्यांकन करता है। लेकिन अगर आप वास्तविक बूलियन मूल्य चाहते हैं True, तो मुझे lambda: Trueनिर्माण से बेहतर तरीका नहीं पता है ।

जैसा कि अरन-फ्रे ने ऊपर कहा, हालांकि, आप pickleएक डिफ़ॉल्ट नहीं कर सकते हैं जिसका कारखाना एक है lambda; अगर यह एक विचार है, तो मैं केस्कोली के समाधान के साथ जाऊंगा True.__bool__

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.