NameError: নাম 'স্ব' সংজ্ঞায়িত করা হয় না


144

কেন এমন কাঠামো

class A:
    def __init__(self, a):
        self.a = a

    def p(self, b=self.a):
        print b

একটি ত্রুটি দেয় NameError: name 'self' is not defined?

উত্তর:


159

ডিফল্ট আর্গুমেন্ট মানগুলি ফাংশন সংজ্ঞায়িত সময়ে মূল্যায়ন করা হয়, তবে selfএটি একটি যুক্তি যা কেবল ফাংশন কল সময়ে উপলভ্য। সুতরাং যুক্তি তালিকার যুক্তিগুলি একে অপরকে রেফার করতে পারে না।

কোডটিতে সেইটির জন্য একটি যুক্তি ডিফল্ট করা Noneএবং এটির জন্য একটি পরীক্ষা যুক্ত করা সাধারণ প্যাটার্ন

def p(self, b=None):
    if b is None:
        b = self.a
    print b

4
যদিও আমি মনে করি যে উপরেরটি খুব সুন্দর নয় (আমি রুবি থেকে এসেছি যেখানে জিনিসগুলি ঠিকঠাকভাবে কাজ করে) তবে উপরেরটি প্রকৃতপক্ষে একটি কর্মক্ষেত্র হিসাবে কাজ করে। এটি এখনও বিশ্রী যে অজগর একটি প্যারামিটার তালিকায় নিজেকে অনুপলব্ধ করা বেছে নিয়েছিল।
শেভি

2
@shevy: "স্ব" পাইথন কোন বিশেষ অর্থ, এটা ঠিক নাম সাধারনত প্রথম আর্গুমেন্ট জন্য নির্বাচিত। আপনি "আমি" বা "এক্স" দ্বারা "স্ব" প্রতিস্থাপন করতে পারেন।
সর্বাধিক

এটি করার আরও ভাল উপায় নেই? যদি আমাদের এমন একটি ফাংশন থাকে যা একটি ডজন ডিফল্ট আর্গুমেন্ট নেয় যা স্ব উল্লেখ করা উচিত, বিবৃতি দেওয়া আমাদের কি সত্যিই এক ডজন দরকার? এটি মারাত্মক বিশ্রী।
রিচার্ড জে বারবালাস

16

আপনি যে কোনও ক্ষেত্রে 'বি' সেট করার বিকল্পটি পেতে চান এমন ক্ষেত্রে:

def p(self, **kwargs):
    b = kwargs.get('b', self.a)
    print b

6

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

def foo():
    print(self.bar)

> নামের ত্রুটি: নাম 'স্ব' সংজ্ঞায়িত করা হয় না

def foo(self):
    print(self.bar)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.