मैं __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 जवाब
बिल्ट-इन 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__
विधि को स्पष्ट रूप से कॉल करना शायद एक बेहतर विचार होगा।
आप 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'
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।