python - মগজ - ৬টি মজার ধাঁধা




Python ValueError: আনপ্যাক করার জন্য অনেকগুলি মান (2)

একটি অভিধান অবজেক্ট নিজেই নিজেই আপনি তার চাবি উপর একটি ইটারারেটর দেয়। পাইথন কীগুলি আনপ্যাক করার চেষ্টা করছে, যা আপনি m.type + m.purity থেকে (m, k)

আমার স্ফটিক বল বলছে m.type এবং m.purity উভয় স্ট্রিং, তাই আপনার কীগুলিও স্ট্রিং। স্ট্রিংগুলি যথোপযুক্ত সৃষ্টিকর্তা, তাই তারা অপঠিত হতে পারে; কিন্তু স্ট্রিংয়ের উপর পুনরাবৃত্তি আপনাকে তার অক্ষরগুলির উপর একটি ইটারারেটর দেয়। সুতরাং যখনই m.type + m.purity দুই অক্ষরের বেশি হয়, আপনার কাছে আনপ্যাক করার জন্য অনেকগুলি মান রয়েছে। (এবং যখন এটি সংক্ষিপ্ত হয়, আপনার কাছে আনপ্যাক করার জন্য খুব কম মান থাকে।)

এটি সংশোধন করার জন্য, আপনি স্বরবর্ণের items উপরে স্পষ্টভাবে পুনরাবৃত্তি করতে পারেন, যা আপনি (কী, মান) জোড়াগুলি যা প্রত্যাশা করছেন বলে মনে করেন। কিন্তু যদি আপনি শুধুমাত্র মান চান, তাহলে মানগুলি ব্যবহার করুন।

(2.x, itervalues , iterkeys , এবং iteritems সাধারণত একটি ভাল ধারণা; অ-সংস্করণ সংস্করণগুলি একটি নতুন তালিকা বস্তু তৈরি করে যা মান / কী / আইটেমগুলি ধারণ করে। বড় অভিধান এবং পুনরাবৃত্তির মধ্যে তুচ্ছ কাজগুলির জন্য এটি একটি হতে পারে iter সংস্করণগুলির চেয়ে অনেক বেশি ধীরগতির যা কেবল একটি ইটারারেট সেট করে।)

আমি এই কোড থেকে যে ব্যতিক্রম পেয়েছি:

class Transaction:
    def __init__ (self):
        self.materials = {}

    def add_material (self, m):
        self.materials[m.type + m.purity] = m

    def serialize (self):
        ser_str = 'transaction_start\n'

        for k, m in self.materials:
            ser_str += m.serialize ()

        sert += 'transaction_end\n'
        return ser_str

for লাইন ব্যতিক্রম নিক্ষেপ করা হয়। m গুলি Material বস্তু। কেউ কি কোন ধারণা আছে?


self.materials একটি self.materials এবং ডিফল্টরূপে আপনি শুধু কীগুলির উপর পুনরাবৃত্তি করছেন (স্ট্রিংগুলি যা)।

যেহেতু self.materials দুটির বেশি কী আছে, তাই তারা " k, m " tuple আনপ্যাক করা যাবে না, তাই ValueError exception উত্থাপিত হয়।

পাইথন ২। এক্স এ , কী এবং মানগুলি ( self.materials.iteritems() " k, m ") self.materials.iteritems() করতে, আমরা self.materials.iteritems() ব্যবহার self.materials.iteritems()

যাইহোক, যেহেতু আপনি যেকোনোভাবে কীটি নিক্ষেপ করছেন, তাই আপনি কেবল অভিধানের মানগুলির উপর পুনরাবৃত্তি করতে পারেন:

for m in self.materials.itervalues():

পাইথনে 3. এক্স , dict.values() (যা একটি অভিধান দেখার বস্তু প্রদান করে ) পছন্দ করে:

for m in self.materials.values():




python