मैं __str__() के आउटपुट को बदलने में सक्षम होना चाहता हूं, और इसके लिए **kwargs जोड़ना चाहता हूं।

समस्या: फ़ंक्शन के हस्ताक्षर को बदलना संभव नहीं लगता।

उदाहरण के लिए:

#!/usr/bin/env python3

class my_printable_obj(object):

    def __init__(self, s):
        self.content = s

    def __str__(self, **kwargs):
        fancy = kwargs.get('fancy', '')
        return str(self.content) + fancy



M = my_printable_obj("Something to print")

print(str(M))
print(str(M, fancy=' + a fancy part'))

आउटपुट:

$ ./test_script3str.py 
Something to print
Traceback (most recent call last):
  File "./test_script3str.py", line 17, in <module>
    print(str(M, fancy=' + a fancy part'))
TypeError: 'fancy' is an invalid keyword argument for this function

मैंने देखा कि, TypeError संदेश के बावजूद, अजगर ने my_printable_obj.__str__() का उपयोग किया (__str__() की शुरुआत में print('here') जोड़कर इसे आसानी से देखा जा सकता है)।

क्या ऐसा करने का कोई समाधान है, या किसी कारण से संभव नहीं है? क्या मुझे into_str(self, **kwargs) जैसे किसी अन्य फ़ंक्शन को बेहतर ढंग से परिभाषित करना चाहिए और __str__() के बजाय M.into_str(fancy=' something more') का उपयोग करना चाहिए?

नोट: इसे लिखना:

def __str__(self, fancy=''):
    return str(self.content) + fancy

बिल्कुल वही त्रुटि देता है।

2
zezollo 3 जून 2016, 17:15

2 जवाब

सबसे बढ़िया उत्तर

बिल्ट-इन str एक type है। जब आप str(custom_object) जैसे कुछ निष्पादित करते हैं, तो str का निर्माता ऑब्जेक्ट की __str__() विधि को कॉल करता है। आप इस प्रकार के हस्ताक्षर को बिना ओवरराइट किए नहीं बदल सकते (जो वास्तव में एक अच्छा विचार नहीं है)।

class _str(str):
    def __new__(cls, *args, **kwargs):
        if args:
            obj = args[0]
            if hasattr(obj, '__str__'):
                return obj.__str__(**kwargs)
        return str.__new__(cls, *args, **kwargs)
str = _str

हाँ, स्पष्ट रूप से एक अच्छा विचार नहीं है, लेकिन यहाँ उपयोग है:

class Example:
    def __str__(self, **kwargs):
        return 'kwargs: {}'.format(kwargs)

print str(Example(), arg1=1, arg2=2)
# kwargs: {'arg1': 1, 'arg2': 2}

"डंडर" विधि होने के बावजूद, अपने कस्टम ऑब्जेक्ट पर __str__ विधि को स्पष्ट रूप से कॉल करना शायद एक बेहतर विचार होगा।

3
Jared Goguen 3 जून 2016, 17:35

आप kwarg के साथ जिस फ़ंक्शन को कॉल कर रहे हैं वह है str ( इनबिल्ट फंक्शन).

str() आपके ऑब्जेक्ट पर __str__ विधि को कॉल करता है।


हो सकता है कि आप जो खोज रहे हैं वह है __format__

>>> class MyPrintableObj(object):

    def __init__(self, s):
        self.content = s

    def __format__(self, formatstr):
        return str(self.content) + formatstr

>>> m = MyPrintableObj("Something to print")
>>> '{: a fancy string}'.format(m)
'Something to print a fancy string'
6
James Fenwick 3 जून 2016, 17:33