পাইথন __str__ এবং তালিকা


107

জাভাতে, যদি আমি তালিকা.টোস্ট্রিং () কল করি তবে এটি স্বয়ংক্রিয়ভাবে তালিকার অভ্যন্তরে প্রতিটি বস্তুতে টসস্ট্রিং () পদ্ধতিতে কল করবে। উদাহরণস্বরূপ, যদি আমার তালিকায় o1, o2, এবং o3 অবজেক্ট থাকে তবে list.toString () এর মতো কিছু দেখাবে:

"[" + o1.toString() + ", " + o2.toString() + ", " + o3.toString() + "]"

পাইথনে কি একইরকম আচরণ করার কোনও উপায় আছে? আমি আমার ক্লাসে একটি __str __ () পদ্ধতি প্রয়োগ করেছি, তবে যখন আমি ব্যবহার করে অবজেক্টগুলির একটি তালিকা মুদ্রণ করি:

print 'my list is %s'%(list)

এটি দেখতে এমন কিছু দেখাচ্ছে:

[<__main__.cell instance at 0x2a955e95f0>, <__main__.cell instance at 0x2a955e9638>, <__main__.cell instance at 0x2a955e9680>]

আমি তালিকার অভ্যন্তরে প্রতিটি উপাদান (বা সেই বিষয়ে ডিক) এর জন্য আমার __str__ কে স্বয়ংক্রিয়ভাবে কল করতে পাই অজগর কীভাবে পেতে পারি?


কেবলমাত্র রেফারেন্সের জন্য, এখানে পিইপি 3140 রয়েছে: "স্ট্র (কনটেইনার) টি স্ট্র (আইটেম) কল করা উচিত, পুনরায় (আইটেম) নয়" , যা প্রত্যাখ্যান হয়েছিল।
অ্যালেক্সি

উত্তর:


133

পাইথন তালিকায় কলিং স্ট্রিংটি __repr__অভ্যন্তরের প্রতিটি উপাদানের পদ্ধতিটিকে কল করে । কিছু আইটেমের জন্য, __str__এবং __repr__একই। যদি আপনি এই আচরণটি চান, তবে করুন:

def __str__(self):
    ...
def __repr__(self):
    return self.__str__()

7
সাধারণত সনাক্ত __str__করা পাইথন ডেটা মডেলের__repr__ সাথে একমত নয় , সুতরাং @ ড্যানিয়েল-লিউ প্রস্তাবিত তালিকা বোঝার সমাধানটি বেশি পাইথোনিক।
আইওনিস ফিলিপিসিস

2
তর্ক নেই। আমি জিজ্ঞাসা করা প্রশ্নের উত্তর দিয়েছিলাম, যা প্রায়শই অজগর থেকে আগত একজন নতুন সমস্যা সম্পর্কে ভাবতে চায় তবে এর অর্থ এই নয় যে এটি উত্তর দেওয়ার সর্বোত্তম উপায়।
ডেভিড বার্গার

1
পাইথনটি তার নিজস্ব ডেটা মডেলের সাথে সামঞ্জস্যপূর্ণ হওয়া উচিত এবং সমস্ত আদিম এবং সমষ্টিগুলির জন্য একই জিনিস করা উচিত।
টেরেন্স ব্র্যানন 16

2
আমি মনে করি পাইথন তালিকার জন্য ডিফল্ট আচরণটি সম্পূর্ণ ভুল plain আমি প্রত্যাশা করব যে str()তালিকার str()ভিতরে প্রতিটি পৃথক উপাদানগুলির জন্য ফিরে এসেছে ।
সুপারজিও

21

আপনি প্রতিটি আইটেম str () 'd এর সাথে নতুন তালিকা তৈরি করতে একটি তালিকা বোঝার ব্যবহার করতে পারেন :

print([str(item) for item in mylist])

6
বা কেবল print(map(str, mylist))- এটি একটি সামান্য বিট সংক্ষিপ্ত
আনুলা

4
এর সাথে একটি সমস্যা হ'ল যদি মাইলিস্টে থাকা আইটেমটিও একটি তালিকা হতে পারে
ব্র্যান্ডান ডালটন

7

দুটি সহজ কাজ আপনি করতে পারেন, এটি ব্যবহার করুন map ফাংশনটি বা কোনও উপলব্ধি ব্যবহার করুন।

কিন্তু এটি আপনাকে স্ট্রিংগুলির তালিকা দেয়, স্ট্রিং নয়। সুতরাং আপনি এছাড়াও স্ট্রিং একসাথে যোগদান করতে হবে।

s= ",".join( map( str, myList ) )

অথবা

s= ",".join( [ str(element) for element in myList ] )

তারপরে আপনি এই সমন্বিত স্ট্রিং অবজেক্টটি মুদ্রণ করতে পারেন।

print 'my list is %s'%( s )

4

আপনি কীসের জন্য এই আউটপুটটি ব্যবহার করতে চান তার উপর নির্ভর করে সম্ভবত __repr__আরও উপযুক্ত হতে পারে:

import unittest

class A(object):
    def __init__(self, val):
        self.val = val

    def __repr__(self):
        return repr(self.val)

class Test(unittest.TestCase):
    def testMain(self):
        l = [A('a'), A('b')]
        self.assertEqual(repr(l), "['a', 'b']")

if __name__ == '__main__':
    unittest.main()

3

আমি এটি করতে তালিকা বোধগম্যতা ব্যবহারের পূর্ববর্তী উত্তরের সাথে একমত, তবে আপনি অবশ্যই এটি কোনও ফাংশনের পিছনে লুকিয়ে রাখতে পারেন, যদি এটিই আপনার নৌকাকে ভাসিয়ে দেয়।

def is_list(value):
    if type(value) in (list, tuple): return True
    return False

def list_str(value):
    if not is_list(value): return str(value)
    return [list_str(v) for v in value]

কেবল মজাদার জন্য, আমি তালিকায় থাকা সমস্ত তালিকা তালিকার () পুনরাবৃত্তভাবে str () তৈরি করেছি।


+1 বাস্তবায়নের সময় __str__এবং __repr__আলাদাভাবে এটি দরকারী
ভিনসেন্ট গ্র্যাভিটাস


0

এই যথেষ্ট করা উচিত।

তালিকাগুলি পাশাপাশি অন্যান্য ধারক শ্রেণীর মুদ্রণ করার সময় অন্তর্ভুক্ত উপাদানগুলি ব্যবহার করে মুদ্রণ করা হবে __repr__, কারণ __repr__এটি অভ্যন্তরীণ বস্তুর উপস্থাপনের জন্য ব্যবহার করা। যদি আমরা কল করি: help(object.__repr__)এটি আমাদের বলবে:

Help on wrapper_descriptor:

__repr__(self, /)
    Return repr(self).

এবং আমরা যদি help(repr)এটি কল আউটপুট হবে:

Help on built-in function repr in module builtins:

repr(obj, /)
    Return the canonical string representation of the object.

    For many object types, including most builtins, eval(repr(obj)) == obj.

যদি __str__কোনও অবজেক্টের জন্য প্রয়োগ করা হয় এবং __repr__তা না repr(obj)হয়ে পূর্বনির্ধারিত আউটপুট আউটপুট দেয়, ঠিক তেমনটি print(obj)যখন বাস্তবায়ন করা হয় না।

সুতরাং একমাত্র উপায় __repr__আপনার ক্লাসের জন্য বাস্তবায়ন । এটি করার একটি সম্ভাব্য উপায় হ'ল:

class C:           
    def __str__(self):
        return str(f"{self.__class__.__name__} class str ")

C.__repr__=C.__str__       
ci = C()    


print(ci)       #C class str 
print(str(ci))  #C class str 
print(repr(ci)) #C class str 

-3

আপনি যে আউটপুটটি পাচ্ছেন তা হ'ল অবজেক্টের মডিউলের নাম, শ্রেণীর নাম এবং __repr__ফাংশনটি ওভাররাইড না হওয়ায় হেক্সাডেসিমেলের মেমরি ঠিকানা ।

__str__মুদ্রণ ব্যবহার করার সময় কোনও বস্তুর স্ট্রিং উপস্থাপনার জন্য ব্যবহৃত হয়। তবে যেহেতু আপনি অবজেক্টের একটি তালিকা মুদ্রণ করছেন, এবং কলটির জন্য তালিকার উপরে পুনরাবৃত্তি করছেন নাstr প্রতিটি আইটেমের জন্য পদ্ধতিটি জন্য এটি বস্তুর প্রতিনিধিত্বকে মুদ্রণ করে।

আছে __str__ফাংশন প্রার্থনা আপনি ভালো কিছু করতে প্রয়োজন চাই:

'my list is %s' % [str(x) for x in myList]

আপনি যদি __repr__ফাংশনটি ওভাররাইড করেন তবে আপনি আগের মতো মুদ্রণ পদ্ধতিটি ব্যবহার করতে পারেন:

class cell:
    def __init__(self, id):
        self.id = id
    def __str__(self):
        return str(self.id) # Or whatever
    def __repr__(self):
        return str(self) # function invoked when you try and print the whole list.

myList = [cell(1), cell(2), cell(3)]
'my list is %s' % myList

তারপরে আপনি my list is [1, 2, 3]আপনার আউটপুট হিসাবে " " পাবেন ।


এই উত্তরটি একটি সম্পূর্ণ সম্পর্কযুক্ত প্রশ্নের উত্তর দিচ্ছে বলে মনে হচ্ছে। আপনি কি নিশ্চিত যে আপনি এটি সঠিক জায়গায় রেখেছেন?
ব্ল্যাকঙ্কহট

হ্যাঁ এই পৃষ্ঠায় ব্ল্যাকঙ্ক্ট এই পৃষ্ঠায় আমি আমার উত্তরটি দিতে চেয়েছিলাম অন্য একটি পোস্ট থেকে এই পৃষ্ঠায় একটি লিঙ্ক ছিল so সুতরাং এটি আমাকে এখানে গাইড করে এবং আমি এখানে উত্তর দিয়েছি যে প্রশ্নটি করা লোকটি আবার এখানে আসবে এবং আমার উত্তরটি দেখতে পাবে..সরি জন্য দুঃখিত অসুবিধা !!!
পানগিওটিস কলিগগণ

যদি অন্য প্রশ্নটির এটির সদৃশ হিসাবে বন্ধ হয়ে যায়, তবে এটি এক ধরণের ধারণা করা হয় যে এখানে বিদ্যমান উত্তরগুলি ইতিমধ্যে অন্য প্রশ্নের যত্ন নেওয়া উচিত। যদি এটি না হয়, তবে আপনার এখানে একটি অপূরণীয় উত্তর পোস্ট করার চেয়ে প্রশ্নটি পুনরায় খোলার জন্য পতাকাঙ্কিত করা উচিত, এটি অবশ্যই মুছে ফেলা হবে। এখন, আপনার পক্ষে এমন কিছু বলার সম্ভাবনা রয়েছে যা এখানে 8 টিরও একটিরও উত্তর দ্বারা আচ্ছাদিত নয়, তবে আপনার উত্তরটি এই পৃষ্ঠার প্রেক্ষাপটে বোঝাতে হবে, যেহেতু এটিই আপনি যে প্রশ্নটির উত্তর দিচ্ছেন তাই। এবং দুটি অভিন্ন উত্তর পোস্ট করবেন না!
ব্ল্যাকঙ্কহাত

1
ওহ, যদিও এখন আমি এটি আবার তাকিয়ে দেখছি, মনে হচ্ছে @ চর্লিবিবেক আপনার অনুলিপিক কারণে নিজের উত্তর পোস্ট করার পরিবর্তে আপনার পোস্টটিকে সম্পূর্ণ আলাদা বলে সম্পাদনা করেছেন। এটি সাধারণত সম্পাদনাগুলি কীভাবে কাজ করে তা নয় ...
ব্ল্যাককিংহাত

@blckknght উত্তরটি বন্ধ হয়ে যাওয়ার আগে বুঝতে পারার আগে আমি এটিকে সম্পাদনা শুরু করেছি। আমি কেন চালিয়ে গেলাম তা সম্পূর্ণরূপে অবর্ণনীয়।
Charliebeckwith
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.