Dlaczego nazwanie zmiennej idw Pythonie jest złe ?
ID.
Dlaczego nazwanie zmiennej idw Pythonie jest złe ?
ID.
Odpowiedzi:
id() to podstawowa wbudowana:
Pomoc dotycząca funkcji wbudowanej
idw module__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.)
Ogólnie rzecz biorąc, używanie nazw zmiennych, które przesłaniają słowo kluczowe lub funkcję wbudowaną w dowolnym języku, jest złym pomysłem, nawet jeśli jest dozwolone.
idbył kiedyś przeznaczony do usunięcia, ale ostatecznie zdecydowali się go nie usuwać. Nie mogę już edytować swojego oryginalnego komentarza, więc usunę go, aby w przyszłości nie wprowadzać ludzi w błąd.
str = 'an example word:cat!!'. Czy w którymś z PEP jest coś, co mówi, że nie rób tego?
W PEP 8 - Przewodnik po stylach dla kodu w języku Python następujące wskazówki pojawiają się w sekcji Opisowe: Style nazewnictwa :
single_trailing_underscore_: używany przez konwencję, aby uniknąć konfliktów ze słowem kluczowym Python, np
Tkinter.Toplevel(master, class_='ClassName')
Tak więc, odpowiadając na pytanie, przykładem zastosowania tej wytycznej jest:
id_ = 42
Umieszczenie końcowego podkreślenia w nazwie zmiennej wyjaśnia intencję (dla osób zaznajomionych z wytycznymi w PEP 8).
idjest elementem wbudowanym, a nie słowem kluczowym, a to nie wyjaśnia, dlaczego źle jest cienia element wbudowany.
idjest funkcją wbudowaną, która podaje tożsamość obiektu (który jest również adresem pamięci w CPythonie). Jeśli nazwiesz jedną ze swoich funkcji id, będziesz musiał powiedzieć, builtins.idaby uzyskać oryginał (lub __builtins__.idw CPythonie). Globalna zmiana nazwy idjest myląca z wyjątkiem małego skryptu.
Jednak ponowne użycie wbudowanych nazw jako zmiennych nie jest takie złe, o ile jest to użycie lokalne. Python ma wiele wbudowanych funkcji, które (1) mają pospolite nazwy i (2) i tak niewiele będziesz używać. Używanie ich jako zmiennych lokalnych lub elementów obiektu jest OK, ponieważ z kontekstu wynika, co robisz:
Przykład:
def numbered(filename):
with open(filename) as file:
for i, input in enumerate(file):
print("%s:\t%s" % (i, input), end='')
Niektóre wbudowane funkcje o kuszących nazwach:
idfilelist, dictmapall, anycomplex, intdirinputslicebuffersummin, maxobject_do nazwy zmiennej. Zobacz moją odpowiedź .
idfunkcja zwracająca adres pamięci obiektu jest szczegółem implementacji CPythona. Warto również zauważyć, że funkcja jest wymagana tylko do zwrócenia innej liczby dla dowolnych dwóch istniejących obiektów. Jeśli obiekt jest odśmiecany, jego identyfikator może zostać odtworzony.
Mógłbym powiedzieć coś niepopularnego: id()jest to raczej wyspecjalizowana wbudowana funkcja, która jest rzadko używana w logice biznesowej. Dlatego nie widzę problemu w używaniu go jako nazwy zmiennej w ciasnej i dobrze napisanej funkcji, gdzie jest jasne, że id nie oznacza funkcji wbudowanej.
import this
idZresztą bardzo niewiele osób korzysta z wbudowanego. Powiedział, że zajęło mi to trochę czasu, gdy kolega zastąpił listwbudowaną zmienną lokalną. Zatem ogólna zasada, o której wspominają inni, nadal ma sens.
idto funkcja wbudowana w Pythonie. Przypisanie wartości idspowoduje przesłonięcie funkcji. Najlepiej jest albo dodać przedrostek jak w, some_idalbo użyć go z inną wielkością niż wID .
Wbudowana funkcja przyjmuje pojedynczy argument i zwraca liczbę całkowitą dla adresu pamięci przekazanego obiektu (w CPythonie).
>>> id(1)
9787760
>>> x = 1
>>> id(x)
9787760
Inni wspominali, że jest to mylące, ale chcę wyjaśnić, dlaczego . Oto przykład oparty na prawdziwej historii. Zasadniczo piszę klasę, która przyjmuje idparametr, ale później próbuję użyć wbudowanej 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)
Oczekiwany wynik:
Created Employee 'Taylor Swift' at 0x7efde30ae910
Rzeczywista wydajność:
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
Co? Gdzie próbuję zadzwonić do int? To wszystko jest wbudowane ...
Gdybym to nazwał badge_idlub id_, nie miałbym tego problemu.
Ponieważ Python jest językiem dynamicznym, nadawanie zmiennej i funkcji tej samej nazwy zwykle nie jest dobrym pomysłem. id () jest funkcją w Pythonie, więc nie zaleca się używania zmiennej o nazwie id. Mając to na uwadze, dotyczy to wszystkich funkcji, których możesz użyć ... zmienna nie powinna mieć takiej samej nazwy jak funkcja.