Mengapa buruk menamai variabel iddengan Python?
ID.
Mengapa buruk menamai variabel iddengan Python?
ID.
Jawaban:
id() adalah bawaan yang mendasar:
Bantuan tentang fungsi built-in
iddalam modul__builtin__:id(...) id(object) -> integer Return the identity of an object. This is guaranteed to be unique among simultaneously existing objects. (Hint: it's the object's memory address.)
Secara umum, menggunakan nama variabel yang melampaui kata kunci atau fungsi bawaan dalam bahasa apa pun adalah ide yang buruk, meskipun diizinkan.
iddijadwalkan untuk dihapus pada satu waktu, tetapi akhirnya mereka memutuskan untuk tidak menghapusnya. Saya tidak lagi dapat mengedit komentar asli saya, jadi saya akan menghapusnya untuk menghindari membingungkan orang di masa mendatang.
str = 'an example word:cat!!'. Apakah ada sesuatu di salah satu PEP yang mengatakan jangan lakukan ini?
Dalam PEP 8 - Panduan Gaya untuk Kode Python , panduan berikut muncul di bagian Deskriptif: Gaya Penamaan :
single_trailing_underscore_: digunakan oleh konvensi untuk menghindari konflik dengan kata kunci Python, mis
Tkinter.Toplevel(master, class_='ClassName')
Nah, untuk menjawab pertanyaan tersebut, contoh yang menerapkan pedoman ini adalah:
id_ = 42
Memasukkan garis bawah di akhir nama variabel membuat maksudnya jelas (bagi mereka yang akrab dengan panduan di PEP 8).
idmerupakan bawaan, bukan kata kunci, dan ini tidak menjelaskan mengapa buruk untuk membayangi bawaan.
idadalah fungsi built-in yang memberikan identitas suatu objek (yang juga merupakan alamat memorinya di CPython). Jika Anda menyebutkan salah satu fungsi idAnda, Anda harus mengatakan builtins.iduntuk mendapatkan yang asli (atau __builtins__.iddi CPython). Mengganti nama idsecara global membingungkan dalam hal apa pun kecuali skrip kecil.
Namun, menggunakan kembali nama built-in sebagai variabel tidak terlalu buruk selama penggunaannya bersifat lokal. Python memiliki banyak fungsi bawaan yang (1) memiliki nama umum dan (2) Anda tetap tidak akan menggunakannya. Menggunakan ini sebagai variabel lokal atau sebagai anggota objek tidak apa-apa karena jelas dari konteks apa yang Anda lakukan:
Contoh:
def numbered(filename):
with open(filename) as file:
for i, input in enumerate(file):
print("%s:\t%s" % (i, input), end='')
Beberapa bawaan dengan nama yang menggoda:
idfilelist, dictmapall, anycomplex, intdirinputslicebuffersummin, maxobject_nama variabel. Silakan lihat jawaban saya .
idfungsi yang mengembalikan alamat memori suatu objek adalah detail implementasi CPython. Perlu juga dicatat bahwa fungsi tersebut hanya diperlukan untuk mengembalikan angka yang berbeda untuk dua objek yang masih ada . Jika suatu objek dikumpulkan sampah, id-nya dapat didaur ulang.
Saya mungkin mengatakan sesuatu yang tidak populer di sini: id()adalah fungsi bawaan yang agak terspesialisasi yang jarang digunakan dalam logika bisnis. Oleh karena itu saya tidak melihat masalah dalam menggunakannya sebagai nama variabel dalam fungsi yang ketat dan ditulis dengan baik, di mana jelas bahwa id bukan berarti fungsi bawaan.
import this
idbuiltin. Yang mengatakan butuh beberapa saat ketika seorang kolega mengganti listbuiltin dengan variabel lokal. Jadi aturan umum yang disebutkan orang lain masih masuk akal.
idadalah fungsi bawaan dengan Python. Menetapkan nilai ke idakan mengganti fungsi. Cara terbaik adalah menambahkan awalan seperti di some_idatau menggunakannya dalam kapitalisasi berbeda seperti di ID.
Fungsi bawaan mengambil satu argumen dan mengembalikan integer untuk alamat memori dari objek yang Anda lewati (dalam CPython).
>>> id(1)
9787760
>>> x = 1
>>> id(x)
9787760
Orang lain telah menyebutkan bahwa itu membingungkan, tetapi saya ingin menjelaskan mengapa . Berikut contohnya, berdasarkan kisah nyata. Pada dasarnya, saya menulis kelas yang mengambil idparameter tetapi kemudian mencoba menggunakan bawaan idnanti.
class Employee:
def __init__(self, name, id):
"""Create employee, with their name and badge id."""
self.name = name
self.id = id
# ... lots more code, making you forget about the parameter names
print('Created', type(self).__name__, repr(name), 'at', hex(id(self)))
tay = Employee('Taylor Swift', 1985)
Output yang diharapkan:
Created Employee 'Taylor Swift' at 0x7efde30ae910
Output aktual:
Traceback (most recent call last):
File "company.py", line 9, in <module>
tay = Employee('Taylor Swift', 1985)
File "company.py", line 7, in __init__
print('Created', type(self).__name__, repr(name), 'at', hex(id(self)))
TypeError: 'int' object is not callable
Hah? Di mana saya mencoba menelepon int? Itu semua adalah bawaan ...
Jika saya telah menamainya badge_idatau id_, saya tidak akan mengalami masalah ini.
Karena python adalah bahasa dinamis, biasanya bukan ide yang baik untuk memberi nama yang sama pada variabel dan fungsi. id () adalah fungsi dalam python, jadi disarankan untuk tidak menggunakan variabel bernama id. Mengingat hal itu, itu berlaku untuk semua fungsi yang mungkin Anda gunakan ... variabel tidak boleh memiliki nama yang sama sebagai fungsi.