'id' Python'da bozuk bir değişken adı


141

idPython'da bir değişkene isim vermek neden kötü ?


33
Çoğu kişi yerleşik / anahtar kelimelerle çakışan tanımlayıcılara bir alt çizgi ekler: id_, map_, list_, filter_, vb.
CDLeary

3
Daha sinsi bir çözüm bir değişken kullanmak olacaktır ID.
Simon Kuang

46
Daha iyi bir soru ... Yerleşik bir işlev için böylesine yaygın, jenerik bir adın kullanılması ne dahi iyi bir fikirdi?
Temel

Yanıtlar:


143

id() temel bir yerleşiktir:

idModüldeki yerleşik işlev hakkında yardım __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.)

Genel olarak, bir anahtar kelimeyi ya da yerleşik işlevi herhangi bir dilde tutan değişken adlarının kullanılması, izin verilse bile kötü bir fikirdir.


3
Tamam, 'id' için haklısın, ama "genel olarak ..." yorumu hala geçerli, değil mi?
Kevin Little

5
Modül küreselleri için kesinlikle bundan kaçınırdım. Yerel kapsamla sınırlı değişkenler için, aynı fonksiyonun yerleşik'i kullanması gerekmeyeceğini görebilirsiniz, endişeleneceğim bir şey değil.
bobince

@Caramdir: İyi yakalama, idbir kerede çıkarılması planlandı, ancak sonunda kaldırmamaya karar verdiler. Artık orijinal yorumumu düzenleyemiyorum, bu nedenle gelecekte insanları karıştırmamak için onu sileceğim.
Eli Courtwright

20
@EliCourtwright Keşke kaldırmış olsaydı. Ne kötü adlandırılmış bir yöntem! Binlerce yerde kullanılan genel, ortak bir ad (içeriğin anlam verdiği yerlerde). Birisi onu bağlamın olmadığı global bir isim olarak kullanmaya karar verdi.
Temel

2
Şaşırtıcı bir şekilde, Google'ın kendi Python regex öğreticisini ( developers.google.com/edu/python/regular-expressions ) kullanır str = 'an example word:cat!!'. KEP'lerin hiçbirinde bunu yapmadığını söyleyen bir şey var mı?
wordsforthewise

57

In PEP 8 - Python Kodu için Stil Rehberi , bölüm aşağıdaki rehberlik göründüğünü Açıklayıcı: Adlandırma Styles :

  • single_trailing_underscore_ : kurallara göre Python anahtar kelimesi ile çakışmaları önlemek için kullanılır, ör.

    Tkinter.Toplevel(master, class_='ClassName')

Bu nedenle, soruyu cevaplamak için bu yönergeyi uygulayan bir örnek:

id_ = 42

Değişken adına sondaki alt çizginin dahil edilmesi, amacı (PEP 8'deki rehbere aşina olanlar) netleştirir.


1
Bu asıl soruya cevap vermiyor, ancak PEP-8 adlandırma kuralı için +1
ege

İyi tavsiye, ama idbir anahtar kelime değil, bir yerleşiktir ve bu bir yerleşikin gölgelenmesinin neden kötü olduğunu açıklamaz.
wjandrea

51

idbir nesnenin kimliğini veren (aynı zamanda CPython'daki bellek adresidir) yerleşik bir işlevdir. Eğer işlevlerden birini isim ise id, söyleyecek olacak builtins.idorijinali almak (veya __builtins__.idCPython olarak). idGlobal olarak yeniden adlandırmak küçük bir senaryo dışında her şeyde kafa karıştırıcıdır.

Ancak, yerleşik adları değişken olarak yeniden kullanmak, kullanım yerel olduğu sürece o kadar da kötü değildir. Python'un (1) ortak isimleri olan ve (2) zaten çok fazla kullanmayacağınız birçok yerleşik işlevi vardır. Bunları yerel değişkenler olarak veya bir nesnenin üyeleri olarak kullanmak sorun değil, çünkü yaptığınız içerikten açıkça anlaşılıyor:

Misal:

def numbered(filename):
    with open(filename) as file:
        for i, input in enumerate(file):
            print("%s:\t%s" % (i, input), end='')

Cazip isimlerle bazı yerleşikler:

  • id
  • file
  • list, dict
  • map
  • all, any
  • complex, int
  • dir
  • input
  • slice
  • buffer
  • sum
  • min, max
  • object

8
01-Ağu-2013'te güncellenen PEP 8 , şimdi _değişken ismine ekleyerek potansiyel karışıklıktan kaçınmayı tavsiye ediyor. Lütfen cevabımı gör .
DavidRR

1
idBir nesnenin bellek adresini döndüren işlevin bir CPython uygulama ayrıntısı olduğunu belirtmek gerekir . Ayrıca, işlevin sadece mevcut iki nesne için farklı bir sayı döndürmesi gerektiğini belirtmek gerekir . Bir nesne çöp toplanırsa, kimliği geri dönüştürülebilir.
Zac Crites

@Zac Teşekkürler! Cevabı, adres hakkında o noktayı ve insanların daha fazla okuyabilmesi için bir bağlantı eklemek için düzenledim.
wjandrea

42

Burada popüler olmayan bir şey söyleyebilirim: id()iş mantığında nadiren kullanılan oldukça özel bir yerleşik işlevdir. Bu nedenle, kimliğin yerleşik işlev anlamına gelmediği açık ve iyi yazılmış bir işlevde değişken adı olarak kullanıldığında bir sorun görmüyorum.


1
Yanıt olarak:> id, iş mantığında nadiren kullanılan oldukça özel bir yerleşik> işlevdir. Bu nedenle, onu değişken olarak kullanmada bir sorun görmüyorum> sıkı ve iyi yazılmış bir> isim> id, id> 'in yerleşik işlev anlamına gelmediği açıktır. Bu doğru olsa da, bu değişken adıyla sadece "id" den daha spesifik olmak iyi bir fikir olabilir. Birçok şeyin kimliği vardır (özellikle bir RDBMS ile çalışıyorsanız) ve Tim Peters'ın Python Zen'inin ikinci satırı bize şunu söyler:> Açık, örtük olmaktan iyidir. Gerisini koşarak görün:import this
Ross

9
Yine de mümkünse bundan kaçınırdım. İş arkadaşlarının şikayet duymaktan başka bir nedeni olmasa bile. :-)
Jason Baker

1
Tamamen katılıyorum: küçük bir fonksiyonda (ve dolayısıyla kapsamda) değişken bir "id" isimlendirmek zararsızdır. idZaten yapıyı çok az insan kullanıyor . Bu, bir meslektaşımın yerleşkeyi listyerel bir değişkenle aşması biraz zaman aldı . Yani diğer insanların bahsettiği genel kural hala mantıklı.
silviot

5

Yerleşik bir işlevden sonra herhangi bir değişkeni adlandırmak kötüdür. Bunun nedenlerinden biri, adın geçersiz kılındığını bilmeyen bir okuyucu için kafa karıştırıcı olabilmesidir.


2

idPython'da yerleşik bir işlevdir. Değerine bir değer atamak idişlevi geçersiz kılar. Bir öneki olduğu gibi eklemek ya da olduğu gibi some_idfarklı bir büyük harf kullanmak en iyisidir ID.

Yerleşik işlev tek bir bağımsız değişken alır ve ilettiğiniz nesnenin (CPython'da) bellek adresi için bir tamsayı döndürür.

>>> id(1)
9787760
>>> x = 1
>>> id(x)
9787760

2
yerleşik işleve dokunmayacak bir sınıf özniteliğini veya yöntemini 'id' olarak adlandırabileceğinizi unutmayın.
Toni Ruža


0

Diğerleri bunun kafa karıştırıcı olduğunu belirtti, ancak nedenini genişletmek istiyorum . İşte gerçek bir hikayeye dayanan bir örnek. Temel olarak, bir idparametre alan bir sınıf yazmak ama daha sonra yerleşik kullanmaya çalışın id.

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)

Beklenen çıktı:

Created Employee 'Taylor Swift' at 0x7efde30ae910

Gerçek çıktı:

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

Ha? Nerede int çağırmaya çalışıyorum? Bunların hepsi yerleşik ...

Adını verirsem badge_idya da id_bu problemi yaşamazdım.


-6

Python dinamik bir dil olduğundan, bir değişkene ve işleve aynı adı vermek genellikle iyi bir fikir değildir. id (), python'daki bir işlevdir, bu nedenle id adında bir değişken kullanmamanız önerilir. Bunu göz önünde bulundurarak, kullanabileceğiniz tüm işlevler için geçerlidir ... bir değişkenin işlevle aynı ada sahip olmaması gerekir.


3
"Python dinamik bir dil olduğundan, bir değişkene ve işleve aynı adı vermek genellikle iyi bir fikir değildir." - Bir değişkene ve işleve aynı adı veremezsiniz. Dinamik bir dil olmasıyla hiçbir ilgisi yok. Özelliklere aynı kapsamdaki diğer nesnelerle aynı adları vermek istiyorsanız , aynı zamanda katılmıyorum. "Anahtar" adlı bir sınıfınız, bu sınıfın "anahtar" olarak adlandırılan bir örneği ve "anahtar" adlı başka bir nesnenin bir özelliği olabilir, örn., "Kapı.key".
Purrell
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.