পাইথন __str__ বনাম __unicode__


213

আপনার কখন __str__()বনাম বাস্তবায়ন করা উচিত তার জন্য কি অজগর কনভেনশন রয়েছে __unicode__()? আমি ক্লাসগুলি __unicode__()আরও ঘন ঘন ওভাররাইড দেখেছি __str__()তবে এটি সুসংগত বলে মনে হয় না। যখন কোনওটির তুলনায় অন্যটির বিপরীতে প্রয়োগ করা ভাল হয় তখন কি নির্দিষ্ট বিধি থাকে? উভয় বাস্তবায়ন কি প্রয়োজনীয় / ভাল অনুশীলন?

উত্তর:


257

__str__()এটি পুরানো পদ্ধতি - এটি বাইটগুলি দেয়। __unicode__()এটি নতুন, পছন্দসই পদ্ধতি - এটি অক্ষর প্রদান করে। নামগুলি কিছুটা বিভ্রান্তিকর, তবে 2.x এ আমরা সামঞ্জস্যের কারণে তাদের সাথে আটকেছি। সাধারণত, আপনার আপনার সমস্ত স্ট্রিং ফর্ম্যাটিং এতে রাখা উচিত __unicode__()এবং একটি স্টাব __str__()পদ্ধতি তৈরি করা উচিত :

def __str__(self):
    return unicode(self).encode('utf-8')

3.0 এ, strঅক্ষর ধারণ করে, তাই একই পদ্ধতিগুলির নাম দেওয়া হয়েছে __bytes__()এবং __str__()। এগুলি প্রত্যাশা অনুযায়ী আচরণ করে।


2
SA আপনি উভয় তৈরি মানে ইউনিকোড এবং Str পদ্ধতি বা শুধু স্ট্রিং রাখা: _ (প "") এবং তৈরি স্ট্রিং (ইউনিকোড পদ্ধতি ছাড়া)?
মুন্টু

12
এর মধ্যে একটির বাস্তবায়নে কি কোনও সমস্যা রয়েছে? আপনি কেবল বাস্তবায়ন করবেন __unicode__এবং তারপরে কী করবেন str(obj)?
রিকিএ

9
unicodeNameErrorপাইথন 3 এ একটি উত্থাপন , একটি সাধারণ প্যাটার্ন যা 2 এবং 3 উভয় জুড়ে কাজ করে?
bradley.ayers

1
@ ব্র্যাডলি.ইয়ার্স futureপ্যাকেজটি python_2_unicode_compatibleজ্যাঙ্গোকে নির্ভরতা না করেই সরবরাহ করে ।
Monkpit

1
এটা নির্ভর করে. Python3 ব্যবহার করে না কারণ ইউনিকোড কিন্তু এর পরিবর্তে Str পাইথন 2 জন্য); ইউনিকোড
Eddwin পাজ

23

যদি আমি বিশেষত কোনও নির্দিষ্ট শ্রেণীর জন্য মাইক্রো-অপ্টিমাইজিং স্ট্রিংফিকেশনকে যত্ন না করি তবে আমি সবসময় __unicode__কেবলমাত্র প্রয়োগ করি , কারণ এটি আরও সাধারণ। আমি যখন এই মুহুর্তের পারফরম্যান্স সম্পর্কিত সমস্যাগুলির বিষয়ে যত্ন নিই (যা ব্যতিক্রম, নিয়ম নয়) __str__তখন কেবল (যখন আমি প্রমাণ করতে পারি যে স্ট্রিংযুক্ত আউটপুটে কখনই অ-এসসিআইআই অক্ষর থাকবে না) বা উভয় (যখন উভয়ই সম্ভব হয়) হতে পারে সহায়তা।

এগুলি আমি দৃ solid় নীতিগুলি বলে মনে করি, তবে বাস্তবে এটি জেনে রাখা খুব সাধারণ AS ক্ষেত্রে সরাসরি "ন্যায্য __str__" পদ্ধতির দিকে অগ্রসর হওয়া বেশ সাধারণ বিষয় (তবে আমি যদি কোনও প্রোগ্রামিং টিম এড়ানো এড়াতে স্থানীয় গাইডলাইন প্রস্তাব করি তবে আমি প্রস্তাবটিতে +1 হব, কারণ এই বিষয়গুলিতে ভুল হওয়া সহজ এবং "অকাল অপটিমাইজেশন হ'ল প্রোগ্রামিংয়ের সমস্ত অশুভের মূল" ;-)।


2
পাইথন ২.6.২ এ আমি সম্প্রতি বিভক্ত হয়ে পড়েছি কারণ নির্দিষ্ট বিল্ট-ইন এক্সসেপশন সাবক্লাসের উদাহরণগুলি স্ট্র (ই) এবং ইউনিকোড (ই) সহ বিভিন্ন ফলাফল দিয়েছে। str (e) ব্যবহারকারী-বান্ধব আউটপুট দিয়েছে; ইউনিকোড (ঙ) বিভিন্ন, ব্যবহারকারী-বন্ধুত্বপূর্ণ আউটপুট দিয়েছে। এটি কি বগী আচরণ হিসাবে বিবেচিত? ক্লাসটি ইউনিকোডডেকোডেরর; বিভ্রান্তি এড়াতে আমি সামনে নাম রাখিনি - ব্যতিক্রমটি ইউনিকোড-সম্পর্কিত যেটি বিশেষভাবে প্রাসঙ্গিক নয়।
পল ডু বোইস

13

পৃথিবী আরও ছোট হয়ে যাওয়ার সম্ভাবনা হ'ল আপনি যে কোনও স্ট্রিংয়ের মুখোমুখি হোন তাতে ইউনিকোড শেষ পর্যন্ত থাকবে। সুতরাং যে কোনও নতুন অ্যাপ্লিকেশনগুলির জন্য আপনার কমপক্ষে সরবরাহ করা উচিত __unicode__()। আপনি যদি ওভাররাইড করেন __str__()তবে তা কেবল স্বাদের বিষয়।


8

আপনি যদি জাজানোতে পাইথন 2 এবং পাইথন 3 উভয় ক্ষেত্রেই কাজ করছেন তবে আমি পাইথন_2_উইনিকোড_মুগ্ধকর সাজসজ্জার পরামর্শ দিচ্ছি:

জ্যাঙ্গো স্ট্র () এবং ইউনিকোড () পদ্ধতিগুলি যা পাইথন 2 এবং 3 তে কাজ করে তা সংজ্ঞায়িত করার জন্য একটি সহজ উপায় সরবরাহ করে : আপনাকে অবশ্যই একটি স্ট্র () পদ্ধতি ফেরত পাঠ্য নির্ধারণ করতে হবে এবং পাইথন_2_উনিকোড_কম্পোটিভ () ডেকরেটার প্রয়োগ করতে হবে।

অন্য উত্তরের আগের মন্তব্যে যেমন উল্লেখ করা হয়েছে, ভবিষ্যতের কিছু সংস্করণও এই সাজসজ্জারকে সমর্থন করে। আমার সিস্টেমে পাইথন 2 এর জন্য আমার একটি নতুন ভবিষ্যতের মডিউল ইনস্টল করতে হবে এবং পাইথন 3 এর জন্য ভবিষ্যত ইনস্টল করতে হবে। এর পরে, তারপরে এখানে একটি কার্যকরী উদাহরণ:

#! /usr/bin/env python

from future.utils import python_2_unicode_compatible
from sys import version_info

@python_2_unicode_compatible
class SomeClass():
    def __str__(self):
        return "Called __str__"


if __name__ == "__main__":
    some_inst = SomeClass()
    print(some_inst)
    if (version_info > (3,0)):
        print("Python 3 does not support unicode()")
    else:
        print(unicode(some_inst))

এখানে উদাহরণ আউটপুট (যেখানে ভেনভি 2 / ভেনভি 3 ভার্চুয়ালেনভ উদাহরণস্বরূপ):

~/tmp$ ./venv3/bin/python3 demo_python_2_unicode_compatible.py 
Called __str__
Python 3 does not support unicode()

~/tmp$ ./venv2/bin/python2 demo_python_2_unicode_compatible.py 
Called __str__
Called __str__

3

পাইথন 2: কেবলমাত্র___ __ () প্রয়োগ করুন এবং একটি ইউনিকোড ফিরিয়ে দিন।

কখন __unicode__()বাদ যায় এবং কেউ কল করে unicode(o)বা u"%s"%oপাইথন কল o.__str__()করে এবং সিস্টেম এনকোডিং ব্যবহার করে ইউনিকোডে রূপান্তর করে। ( ডকুমেন্টেশন__unicode__() দেখুন ।)

বিপরীতটি সত্য নয়। আপনি যদি প্রয়োগ করেন __unicode__()তবে তা করেন না __str__(), তবে যখন কেউ কল করে str(o)বা "%s"%oপাইথন ফিরে আসে repr(o)


যুক্তিসহ ব্যাখ্যা

এটি unicodeথেকে কেন ফেরত আসবে __str__()?
যদি __str__()কোনও ইউনিকোড দেয়, পাইথন স্বয়ংক্রিয়ভাবে এটিকে strসিস্টেম এনকোডিং ব্যবহার করে রূপান্তর করে ।

লাভ কী?
① এটি আপনাকে সিস্টেম এনকোডিং (অর্থাত্ locale.getpreferredencoeding(…)) এর উদ্বিগ্নতা থেকে মুক্ত করে । ব্যক্তিগতভাবে কেবল এই অগোছালোই নয়, তবে আমি মনে করি এটি সিস্টেমের যে কোনও উপায়ে যত্ন নেওয়া উচিত। You আপনি যদি সাবধান হন তবে আপনার কোডটি পাইথন 3 এর সাথে ক্রস-সামঞ্জস্যপূর্ণ হতে পারে, যাতে __str__()ইউনিকোড ফেরত।

ডাকা ফাংশন থেকে ইউনিকোড ফিরিয়ে দেওয়া কি প্রতারণামূলক নয় __str__()?
একটু. তবে আপনি ইতিমধ্যে এটি করছেন be আপনি যদি from __future__ import unicode_literalsআপনার ফাইল উপরের, একটি ভাল সুযোগ আপনি এমনকি এটা জেনে একটি ইউনিকোড ফিরে করছি।

পাইথন 3 সম্পর্কে কী?
পাইথন 3 ব্যবহার করে না __unicode__()। তবে আপনি যদি প্রয়োগ করেন __str__()যাতে এটি পাইথন 2 বা পাইথন 3 এর মধ্যে ইউনিকোড ফেরত দেয়, তবে আপনার কোডের সেই অংশটি ক্রস-সামঞ্জস্যপূর্ণ হবে।

যদি আমি unicode(o)থেকে আলাদাভাবে থাকতে চাই str()?
উভয়ই প্রয়োগ করুন __str__()(সম্ভবত ফিরছেন str) এবং __unicode__()। আমি ধারণা করি এটি বিরল হবে, তবে আপনি সম্ভবত আলাদা আলাদা আউটপুট (উদাহরণস্বরূপ, বিশেষ অক্ষরের ASCII সংস্করণ যেমন পছন্দ ":)"করতে পারেন u"☺") চাইবেন ।

আমি বুঝতে পারি যে কেউ কেউ এই বিতর্কিত হতে পারে।


1

__unicode__পাইথন ২.x এর চারপাশে ঘিরে থাকা কিছু ডিফল্ট আচরণের সাথে ফাংশনটির সাথে অপরিচিত যারা তাদের প্রতিশ্রুতিবদ্ধ , এটি বিশেষত যখন পাশাপাশি পাশাপাশি সংজ্ঞায়িত হয় __str__

class A :
    def __init__(self) :
        self.x = 123
        self.y = 23.3

    #def __str__(self) :
    #    return "STR      {}      {}".format( self.x , self.y)
    def __unicode__(self) :
        return u"UNICODE  {}      {}".format( self.x , self.y)

a1 = A()
a2 = A()

print( "__repr__ checks")
print( a1 )
print( a2 )

print( "\n__str__ vs __unicode__ checks")
print( str( a1 ))
print( unicode(a1))
print( "{}".format( a1 ))
print( u"{}".format( a1 ))

নিম্নলিখিত কনসোল আউটপুট দেয় ...

__repr__ checks
<__main__.A instance at 0x103f063f8>
<__main__.A instance at 0x103f06440>

__str__ vs __unicode__ checks
<__main__.A instance at 0x103f063f8>
UNICODE 123      23.3
<__main__.A instance at 0x103f063f8>
UNICODE 123      23.3

এখন যখন আমি __str__পদ্ধতিটি অসম্পূর্ণ করি

__repr__ checks
STR      123      23.3
STR      123      23.3

__str__ vs __unicode__ checks
STR      123      23.3
UNICODE  123      23.3
STR      123      23.3
UNICODE  123      23.3
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.