python अजगर में, क्या किसी प्रकार का "गलत मूल्य" वापस करने के लिए किसी प्रकार की मैपिंग है?




types boolean (4)

मैं किसी प्रकार के मैपिंग फंक्शन f() तलाश कर रहा हूँ जो कुछ इस तरह से हो:

f(str) = ''
f(complex) = 0j
f(list) = []

मतलब यह है कि यह एक प्रकार की वस्तु लौटाता है जो bool कास्ट करते समय False मूल्यांकन करता है।

क्या इस तरह के एक समारोह मौजूद है?


इसे वास्तव में एक पहचान तत्व कहा जाता है, और प्रोग्रामिंग में अक्सर एक monoid की परिभाषा के भाग के रूप में देखा जाता है। अजगर में, आप इसे PyMonad पैकेज में mzero फ़ंक्शन का उपयोग करके एक प्रकार के लिए प्राप्त कर सकते हैं। हास्केल इसे mempty कहता है।


ऐसा कोई फ़ंक्शन मौजूद नहीं है क्योंकि यह सामान्य रूप से संभव नहीं है। एक वर्ग का कोई मिथ्या मूल्य नहीं हो सकता है या उसे __bool__ एक मनमाने ढंग से जटिल कार्यान्वयन को उलटने की आवश्यकता हो सकती है।

बाकी सब चीजों को तोड़कर आप उस वर्ग की एक नई वस्तु का निर्माण कर सकते हैं और अपने __bool__ फ़ंक्शन को उस व्यक्ति को जबरन असाइन कर सकते हैं जो False रिटर्न देता है। हालांकि मुझे संदेह है कि आप एक ऐसी वस्तु की तलाश कर रहे हैं जो अन्यथा वर्ग का एक मान्य सदस्य होगा।

किसी भी मामले में, यह क्लासिक शैली में एक बहुत बुरा विचार है।


सभी प्रकारों के पास शुरू करने के लिए ऐसा मूल्य नहीं है। दूसरों के ऐसे कई मूल्य हो सकते हैं। ऐसा करने का सबसे सही तरीका यह होगा कि आप टाइप-टू-वैल्यू को तानाशाह बनाएँ, क्योंकि तब आप जाँच सकते हैं कि क्या दिए गए प्रकार सभी में से किसी एक में हैं, और आप चुन सकते हैं कि कौन सा वैल्यू सही है अगर कई विकल्प हैं । खामी यह है कि आपको किसी भी तरह से हर उस प्रकार का पंजीकरण करना होगा, जिसमें आप रुचि रखते थे।

वैकल्पिक रूप से, आप कुछ उत्तराधिकार का उपयोग करके एक फ़ंक्शन लिख सकते हैं। यदि आप इस बात से बहुत सावधान थे कि आप इस समारोह में क्या कर रहे हैं, तो यह शायद कुछ सीमित उपयोग का होगा। उदाहरण के लिए, complex को छोड़कर आपके द्वारा दिखाए जाने वाले सभी मामले कंटेनर हैं जो सीएल के साथ सामान्यीकृत होते हैं cls()

complex वास्तव में भी उसी तरह काम करता है, लेकिन मैं इसे अलग से उल्लेख करता हूं क्योंकि int और float नहीं करते हैं। इसलिए यदि खाली कंस्ट्रक्टर के साथ आपका प्रयास किसी सत्य वस्तु को वापस करने या TypeError बढ़ाने में विफल रहता है, तो आप cls(0) आज़मा सकते हैं। इत्यादि इत्यादि...

अद्यतन करें

@ juanpa.arrivillaga का जवाब वास्तव में एक चतुर समाधान सुझाता है जो अधिकांश वर्गों के लिए काम करेगा। आप वर्ग का विस्तार कर सकते हैं और जबरन एक ऐसा उदाहरण बना सकते हैं जो गलत होगा लेकिन मूल वर्ग के समान होगा। आपको इसे विस्तार से करना होगा क्योंकि __bool__ जैसी __bool__ विधियां केवल कक्षा पर कभी __bool__ जाती हैं, कभी उदाहरण पर नहीं। ऐसे कई प्रकार भी हैं जहां इस तरह के तरीकों को शुरू करने के लिए उदाहरण पर प्रतिस्थापित नहीं किया जा सकता है। जैसा कि @ अरण-फे की अब हटाई गई टिप्पणी बताती है, आप चुनिंदा रूप से object.__new__ या t.__new__ , इस बात पर निर्भर करता है कि आप एक बहुत ही विशेष मामले (जैसे int ) से निपट रहे हैं या नहीं:

def f(t):
    class tx(t):
        def __bool__(self):
            return False
    try:
        return object.__new__(tx)
    except TypeError:
        return tx.__new__(tx)

यह केवल उन ९९.९% वर्गों के लिए काम करेगा जिनका आप कभी सामना करते हैं। यह संभव है कि एक object.__new__ मामला बनाना संभव हो, जो object.__new__ लिए पास हो जाए। इसे प्रदर्शित करने के लिए gist @ Aran-Fey देखें।


नहीं, और सामान्य तौर पर, ऐसा कोई मूल्य नहीं हो सकता है। एक प्रकार का सत्य-मूल्य कैसे लागू किया जा सकता है, इसके बारे में पायथन डेटा मॉडल बहुत ढीला है:

object.__bool__(self)

सत्य मूल्य परीक्षण और अंतर्निहित ऑपरेशन बूल () को लागू करने के लिए कहा जाता है; गलत या सच्चा लौटना चाहिए। जब इस विधि को परिभाषित नहीं किया जाता है, तो __len__() कहा जाता है, अगर यह परिभाषित किया गया है, और वस्तु को सही माना जाता है यदि इसका परिणाम गैर-शून्य हो। यदि कोई वर्ग न तो __len__() और न ही __bool__() को परिभाषित करता है, तो उसके सभी उदाहरण सही __bool__() जाते हैं।

तो विचार करें:

import random
class Wacky:
    def __bool__(self):
        return bool(random.randint(0,1))

f(Wacky) को क्या लौटना चाहिए?





boolean