id
파이썬 에서 변수 이름을 짓는 것이 왜 나쁜 가요?
ID
.
id
파이썬 에서 변수 이름을 짓는 것이 왜 나쁜 가요?
ID
.
답변:
id()
기본 내장 기능입니다.
id
모듈의 내장 기능 에 대한 도움말__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.)
일반적으로 모든 언어에서 키워드 또는 내장 함수를 이클립스하는 변수 이름을 사용하는 것은 허용 되더라도 나쁜 생각입니다.
id
가 한번에 제거 될 예정이지만 결국에는 제거하지 않기로 결정했습니다. 더 이상 내 원래 댓글을 편집 할 수 없으므로 나중에 사람들을 혼란스럽게하지 않기 위해 삭제합니다.
str = 'an example word:cat!!'
. PEP에 이것을하지 않는 것이 있습니까?
에서 PEP 8 - 파이썬 코드에 대한 스타일 가이드 섹션에서 다음지도가 나타납니다 서술 : 명명 스타일 :
single_trailing_underscore_
: 파이썬 키워드와의 충돌을 피하기 위해 관례 적으로 사용
Tkinter.Toplevel(master, class_='ClassName')
따라서 질문에 대답하기 위해이 지침을 적용하는 예는 다음과 같습니다.
id_ = 42
변수 이름에 후행 밑줄을 포함 시키면 의도가 명확 해집니다 (PEP 8의 지침에 익숙한 사람들에게).
id
키워드가 아닌 기본 제공 기능이므로 기본 제공을 어둡게 만드는 것이 왜 나쁜지는 설명하지 않습니다.
id
CPython의 메모리 주소이기도 한 개체의 ID를 제공하는 내장 함수입니다. 함수 중 하나의 이름을 지정 하면 원본 (또는 CPython) 을 가져 오라고 id
말해야 builtins.id
합니다 __builtins__.id
. id
전 세계적으로 이름을 바꾸는 것은 작은 스크립트가 아닌 혼란에 빠집니다.
그러나 내장 이름을 변수로 재사용하는 것이 로컬로 사용되는 한 그렇게 나쁘지는 않습니다. 파이썬에는 (1) 일반적인 이름이 있고 (2) 어쨌든 많이 사용하지 않는 많은 내장 함수가 있습니다. 이것들을 로컬 변수 또는 객체의 멤버로 사용하는 것은 상황에서 분명하기 때문에 분명합니다.
예:
def numbered(filename):
with open(filename) as file:
for i, input in enumerate(file):
print("%s:\t%s" % (i, input), end='')
유혹적인 이름을 가진 일부 내장 기능 :
id
file
list
, dict
map
all
, any
complex
, int
dir
input
slice
buffer
sum
min
, max
object
id
객체의 메모리 주소를 반환 하는 함수는 CPython 구현 세부 사항입니다. 또한이 함수는 존재하는 두 객체에 대해 다른 숫자 만 반환하면된다는 점에 주목할 가치가 있습니다. 객체가 가비지 수집되면 해당 ID가 재활용 될 수 있습니다.
나는 여기에 인기가없는 것을 말할 수 있습니다 : id()
비즈니스 로직에는 거의 사용되지 않는 다소 전문화 된 내장 함수입니다. 따라서 타이트하고 잘 작성된 함수에서 변수 이름으로 변수 이름을 사용할 때 문제가 발생하지 않습니다 .ID가 내장 함수를 의미하지 않는다는 것이 분명합니다.
import this
id
어쨌든 내장을 사용하는 사람은 거의 없습니다 . 동료가 list
내장 변수를 로컬 변수로 덮어 쓰는 데 시간이 걸렸다 고 말했습니다 . 따라서 다른 사람들이 언급 한 일반적인 규칙은 여전히 타당합니다.
다른 사람들은 혼란 스럽다고 언급했지만 이유 를 확장하고 싶습니다 . 다음은 실제 사례를 기반으로 한 예입니다. 기본적으로 id
매개 변수를 사용하지만 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)
예상 출력 :
Created Employee 'Taylor Swift' at 0x7efde30ae910
실제 출력 :
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
응? 어디로 전화를 걸려 고합니까? 그것들은 모두 내장되어 있습니다 ...
이름을 badge_id
또는로 지정하면 id_
이 문제가 발생하지 않았을 것입니다.
파이썬은 동적 언어이기 때문에 일반적으로 변수와 함수에 같은 이름을 부여하는 것은 좋지 않습니다. id ()는 파이썬의 함수이므로 id라는 변수를 사용하지 않는 것이 좋습니다. 그것을 염두에두고, 그것은 당신이 사용할 수있는 모든 함수에 적용됩니다 ... 변수는 함수와 이름이 같아서는 안됩니다.