Kebanyakan orang menambahkan garis bawah ke pengenal yang berbenturan dengan bawaan / kata kunci: id_, map_, list_, filter_, dll.
cdleary
4
Solusi yang lebih licik adalah dengan menggunakan variabel ID.
Simon Kuang
53
Pertanyaan yang lebih baik adalah ... Apa pemikiran jenius yang menggunakan nama umum dan umum untuk fungsi bawaan adalah ide yang bagus?
Dasar
Jawaban:
150
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.
Oke, untuk 'id' Anda benar, tetapi komentar "secara umum ..." masih berlaku, bukan?
Kevin Little
5
Saya akan menghindarinya untuk modul global tentunya. Untuk variabel yang dibatasi pada lingkup lokal, sehingga Anda dapat melihat fungsi yang sama tidak perlu menggunakan builtin, itu bukan sesuatu yang saya khawatirkan.
bobince
@ Caramdir: Hasil tangkapan yang bagus, 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.
Eli Courtwright
23
@EliCourtwright Saya berharap mereka telah menghapusnya. Sungguh metode yang buruk namanya! Nama umum dan umum yang digunakan di ribuan tempat (di mana konteks memberi arti). Jadi seseorang memutuskan untuk menggunakannya sebagai nama global di mana tidak ada konteksnya?
Dasar
2
Hebatnya, tutorial Python regex milik Google ( developers.google.com/edu/python/regular-expressions ) menggunakan str = 'an example word:cat!!'. Apakah ada sesuatu di salah satu PEP yang mengatakan jangan lakukan ini?
kata
63
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).
Ini tidak menjawab pertanyaan sebenarnya, tetapi +1 untuk konvensi penamaan PEP-8
ege
1
Saran yang bagus, tetapi idmerupakan bawaan, bukan kata kunci, dan ini tidak menjelaskan mengapa buruk untuk membayangi bawaan.
wjandrea
55
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:
defnumbered(filename):with open(filename) as file:
for i, input in enumerate(file):
print("%s:\t%s" % (i, input), end='')
PEP 8 , yang diperbarui 01-Agustus-2013, sekarang menyarankan untuk menghindari potensi kebingungan hanya dengan menambahkan _nama variabel. Silakan lihat jawaban saya .
DavidRR
1
Perlu dicatat bahwa 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.
Zac Crites
@Zac Terima kasih! Saya mengedit jawaban untuk menambahkan poin itu tentang alamat memori, dan tautan sehingga orang dapat membaca lebih banyak.
wjandrea
46
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.
Menanggapi:> id adalah fungsi built-in> yang agak terspesialisasi yang jarang digunakan> dalam logika bisnis. Oleh karena itu saya tidak melihat> masalah dalam menggunakannya sebagai variabel> nama dalam fungsi> yang ketat dan ditulis dengan baik, yang jelas bahwa id> tidak berarti fungsi bawaan. Meskipun ini benar, mungkin ide yang baik untuk lebih spesifik dengan nama variabel ini daripada hanya "id". Banyak hal memiliki ID (terutama jika Anda bekerja dengan RDBMS), dan baris kedua dari The Zen of Python dari Tim Peters memberi tahu kita:> Eksplisit lebih baik daripada implisit. Lihat sisanya dengan berlari:import this
Ross
10
Saya masih akan menghindarinya jika memungkinkan. Bahkan jika tidak ada alasan lain selain tidak mendengar rekan kerja mengeluh. :-)
Jason Baker
3
Saya sepenuhnya setuju: menamai variabel "id" dalam fungsi kecil (dan dengan demikian cakupan) tidak berbahaya. Sangat sedikit orang yang menggunakan idbuiltin. Yang mengatakan butuh beberapa saat ketika seorang kolega mengganti listbuiltin dengan variabel lokal. Jadi aturan umum yang disebutkan orang lain masih masuk akal.
silviot
5
Tidak baik memberi nama variabel apa pun setelah fungsi bawaan. Salah satu alasannya adalah karena dapat membingungkan pembaca yang tidak tahu namanya diganti.
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).
perhatikan bahwa Anda dapat memberi nama atribut kelas atau metode 'id', yang tidak akan menyentuh fungsi bawaan.
Toni Ruža
2
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.
classEmployee: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 isnot 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.
"Karena python adalah bahasa dinamis, biasanya bukan ide yang baik untuk memberi nama yang sama pada variabel dan fungsi." - Anda tidak dapat memberikan nama yang sama pada variabel dan fungsi. Tidak ada hubungannya dengan itu menjadi bahasa yang dinamis. Jika Anda bermaksud memberi properti nama yang sama dengan objek lain dalam lingkup yang sama, saya juga tidak setuju. Anda mungkin memiliki kelas yang disebut "Kunci", turunan dari kelas itu yang disebut "kunci" dan properti objek lain yang disebut "kunci", misalnya, "pintu.key".
ID
.Jawaban:
id()
adalah bawaan yang mendasar:Secara umum, menggunakan nama variabel yang melampaui kata kunci atau fungsi bawaan dalam bahasa apa pun adalah ide yang buruk, meskipun diizinkan.
sumber
id
dijadwalkan 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 :
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).
sumber
id
merupakan bawaan, bukan kata kunci, dan ini tidak menjelaskan mengapa buruk untuk membayangi bawaan.id
adalah fungsi built-in yang memberikan identitas suatu objek (yang juga merupakan alamat memorinya di CPython). Jika Anda menyebutkan salah satu fungsiid
Anda, Anda harus mengatakanbuiltins.id
untuk mendapatkan yang asli (atau__builtins__.id
di CPython). Mengganti namaid
secara 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:
id
file
list
,dict
map
all
,any
complex
,int
dir
input
slice
buffer
sum
min
,max
object
sumber
_
nama variabel. Silakan lihat jawaban saya .id
fungsi 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.sumber
import this
id
builtin. Yang mengatakan butuh beberapa saat ketika seorang kolega menggantilist
builtin dengan variabel lokal. Jadi aturan umum yang disebutkan orang lain masih masuk akal.Tidak baik memberi nama variabel apa pun setelah fungsi bawaan. Salah satu alasannya adalah karena dapat membingungkan pembaca yang tidak tahu namanya diganti.
sumber
id
adalah fungsi bawaan dengan Python. Menetapkan nilai keid
akan mengganti fungsi. Cara terbaik adalah menambahkan awalan seperti disome_id
atau menggunakannya dalam kapitalisasi berbeda seperti diID
.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
sumber
Orang lain telah menyebutkan bahwa itu membingungkan, tetapi saya ingin menjelaskan mengapa . Berikut contohnya, berdasarkan kisah nyata. Pada dasarnya, saya menulis kelas yang mengambil
id
parameter tetapi kemudian mencoba menggunakan bawaanid
nanti.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:
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
Jika saya telah menamainya
badge_id
atauid_
, saya tidak akan mengalami masalah ini.sumber
Karena itu nama fungsi bawaan.
sumber
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.
sumber