পাইথন __getitem__ এবং অপারেটরের ফলস্বরূপ অদ্ভুত আচরণ


34

নিম্নলিখিত আচরণটি কী ব্যাখ্যা করে:

class Foo:
    def __getitem__(self, item):
        print("?")
        return 1

f = Foo()

1 in f  # prints one ? and returns True

5 in f  # prints ? forever until you raise a Keyboard Exception

# Edit: eventually this fails with OverflowError: iter index too large

উত্তর:


45

যদি কোনও অবজেক্টের __contains__বাস্তবায়ন না হয় তবে inডিফল্টর উপর পড়ে যা মূলত এইভাবে কাজ করে:

def default__contains__(self, element):
    for thing in self:
        if thing == element:
            return True
    return False

এবং যদি কোনও অবজেক্টের __iter__বাস্তবায়ন না হয় তবে forডিফল্টর উপর পড়ে যা মূলত এইভাবে কাজ করে:

def default__iter__(self):
    i = 0
    try:
        while True:
            yield self[i]
            i += 1
    except IndexError:
        pass

এই ডিফল্টগুলি ব্যবহার করা হয় এমনকি যদি বস্তুটি সিকোয়েন্সের উদ্দেশ্যে না হয়।

আপনার 1 in fএবং 5 in fপরীক্ষাগুলি ডিফল্ট ফ্যালব্যাকগুলি ব্যবহার করছে inএবং এর forফলে পর্যবেক্ষণ করা আচরণের দিকে পরিচালিত করবে। তাত্ক্ষণিকভাবে 1 in fসন্ধান 1করে তবে আপনার __getitem__কখনও ফিরে আসে না 5, তাই 5 in fচিরকাল চলে।

(আচ্ছা, আসলে, পাইথনের রেফারেন্স বাস্তবায়নের ক্ষেত্রে, ডিফল্ট __iter__ফ্যালব্যাক সূচকটি সি-লেভেল ভেরিয়েবলের ধরণের Py_ssize_tআকারে সংরক্ষণ করে, তাই আপনি যদি দীর্ঘক্ষণ অপেক্ষা করেন, তবে ভেরিয়েবলটি ম্যাক্স আউট হয়ে যায় এবং পাইথন একটি ওভারফ্লোআরার উত্থাপন করে If আপনি যদি তা দেখে থাকেন তবে আপনি অবশ্যই 32-বিট পাইথন বিল্ডে থাকা উচিত Comp


ওভারফ্লো ইরর সম্পর্কিত, আমি এটি 64 এবং 32 বিট উভয়ই চালিয়েছি এবং আপনি ঠিক বলেছেন আমি এটি কেবল 32 বিটে দেখেছি।
ম্যাথু ময়েসেন

আপনি কি ডকুমেন্টেশন সম্পর্কে জানেন যা এটি ব্যাখ্যা করে? আমি কেন এই বাস্তবায়ন সিদ্ধান্ত নিয়েছে তা পড়তে চাই।
ম্যাথু ময়েসেন

3
@Matthew প্রকাশ> সদস্যপদ পরীক্ষা অপারেশন , এছাড়াও .__ contains__ আপত্তি এবং এটি উপরে ডান অনুচ্ছেদ
wjandrea

4
@MatthewMoisen: এই অক্ষমতা মূল আচরণ ছিল forএবং in, প্রবর্তনের predating __iter__এবং __contains__। পাইথন ১.৪ ডকুমেন্টেশনটি এখানে এবং এখানে দেখুন
ব্যবহারকারী 2357112
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.