NameError: nama 'diri' tidak didefinisikan

144

Mengapa struktur seperti itu

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

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

memberi kesalahan NameError: name 'self' is not defined?

Chriss
sumber

Jawaban:

159

Nilai argumen default dievaluasi pada waktu fungsi-menentukan, tetapi selfmerupakan argumen hanya tersedia pada waktu panggilan fungsi. Jadi argumen dalam daftar argumen tidak dapat saling merujuk.

Ini adalah pola umum untuk menetapkan argumen Nonedan menambahkan tes untuk itu dalam kode:

def p(self, b=None):
    if b is None:
        b = self.a
    print b
Intgr
sumber
4
Meskipun saya pikir hal di atas tidak terlalu cantik (saya berasal dari ruby ​​di mana semuanya berfungsi dengan baik), hal di atas sebenarnya berfungsi sebagai solusi. Masih aneh bahwa python memilih untuk membuat diri tidak tersedia di daftar parameter.
Shevy
2
@shevy: "self" tidak memiliki arti khusus dalam python, hanya nama yang dipilih secara konvensional untuk argumen pertama. Anda juga dapat mengganti "diri" dengan "saya" atau "x".
Maks
Apakah tidak ada cara yang lebih baik untuk melakukan ini? Jika kita memiliki fungsi yang membutuhkan selusin argumen default yang harus merujuk diri, apakah kita benar-benar membutuhkan selusin pernyataan if? Ini sangat canggung.
Richard J. Barbalace
16

Untuk kasus di mana Anda juga ingin memiliki opsi pengaturan 'b' ke Tidak Ada:

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

Jika Anda telah tiba di sini melalui google, pastikan untuk memeriksa bahwa Anda telah memberikan diri sebagai parameter pertama ke fungsi kelas. Terutama jika Anda mencoba referensi nilai untuk objek di dalam fungsi.

def foo():
    print(self.bar)

> NameError: nama 'diri' tidak ditentukan

def foo(self):
    print(self.bar)
Erich
sumber