idPython'da bir değişkene isim vermek neden kötü ?
ID.
idPython'da bir değişkene isim vermek neden kötü ?
ID.
Yanıtlar:
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.
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.
str = 'an example word:cat!!'. KEP'lerin hiçbirinde bunu yapmadığını söyleyen bir şey var mı?
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.
idbir anahtar kelime değil, bir yerleşiktir ve bu bir yerleşikin gölgelenmesinin neden kötü olduğunu açıklamaz.
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:
idfilelist, dictmapall, anycomplex, intdirinputslicebuffersummin, maxobject_değişken ismine ekleyerek potansiyel karışıklıktan kaçınmayı tavsiye ediyor. Lütfen cevabımı gör .
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.
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.
import this
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ı.
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
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.
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.