'id'는 파이썬에서 잘못된 변수 이름입니다.


141

id파이썬 에서 변수 이름을 짓는 것이 왜 나쁜 가요?


33
대부분의 사람들은 내장 / 키워드 (id_, map_, list_, filter_ 등)와 충돌하는 식별자에 밑줄을 추가합니다.
cdleary

3
더 교활한 해결책은 변수를 사용하는 것입니다 ID.
Simon Kuang

46
더 좋은 질문은 ... 내장 함수에 대해 일반적이고 일반적인 이름을 사용하는 것이 어떤 천재라고 생각하는 것이 좋을까요?
기본

답변:


143

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.)

일반적으로 모든 언어에서 키워드 또는 내장 함수를 이클립스하는 변수 이름을 사용하는 것은 허용 되더라도 나쁜 생각입니다.


3
좋아, 'id'에 대해서는 맞지만 "일반적으로 ..."라는 의견이 여전히 적용됩니다. 그렇지 않습니까?
Kevin Little

5
모듈 전역에서는 확실히 피할 것입니다. 로컬 범위로 제한된 변수의 경우 동일한 기능이 내장 기능을 사용할 필요가 없다는 것을 알 수 있습니다. 걱정하지 않아도됩니다.
bobince

@Caramdir : 좋은 캐치 id가 한번에 제거 될 예정이지만 결국에는 제거하지 않기로 결정했습니다. 더 이상 내 원래 댓글을 편집 할 수 없으므로 나중에 사람들을 혼란스럽게하지 않기 위해 삭제합니다.
Eli Courtwright

20
@EliCourtwright 나는 그들이 그것을 제거하기를 바랍니다. 불완전하게 명명 된 방법! 수천 곳에서 사용되는 일반적인 일반적인 이름 (컨텍스트가 의미가있는 곳). 그래서 누군가 컨텍스트가없는 글로벌 이름으로 사용하기로 결정 했습니까?
기본

2
놀랍게도 Google의 자체 파이썬 정규식 자습서 ( developers.google.com/edu/python/regular-expressions )는을 사용합니다 str = 'an example word:cat!!'. PEP에 이것을하지 않는 것이 있습니까?
wordsforthewise

57

에서 PEP 8 - 파이썬 코드에 대한 스타일 가이드 섹션에서 다음지도가 나타납니다 서술 : 명명 스타일 :

  • single_trailing_underscore_ : 파이썬 키워드와의 충돌을 피하기 위해 관례 적으로 사용

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

따라서 질문에 대답하기 위해이 지침을 적용하는 예는 다음과 같습니다.

id_ = 42

변수 이름에 후행 밑줄을 포함 시키면 의도가 명확 해집니다 (PEP 8의 지침에 익숙한 사람들에게).


1
이것은 실제 질문에 대한 답은 아니지만 PEP-8 명명 규칙에 대해 +1
ege

좋은 조언이지만 id키워드가 아닌 기본 제공 기능이므로 기본 제공을 어둡게 만드는 것이 왜 나쁜지는 설명하지 않습니다.
wjandrea

51

idCPython의 메모리 주소이기도 한 개체의 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

8
2013 년 8 월 1 일에 업데이트 된 PEP 8_ 은 변수 이름 에 간단히 추가 하여 잠재적 혼란을 피할 것을 권장 합니다. 내 답변을 참조하십시오 .
DavidRR

1
id객체의 메모리 주소를 반환 하는 함수는 CPython 구현 세부 사항입니다. 또한이 함수는 존재하는 두 객체에 대해 다른 숫자 만 반환하면된다는 점에 주목할 가치가 있습니다. 객체가 가비지 수집되면 해당 ID가 재활용 될 수 있습니다.
Zac Crites 13:27에

@Zac 감사합니다! 메모리 주소와 사람들이 더 읽을 수 있도록 링크에 대한 요점을 추가하기 위해 답변을 편집했습니다.
wjandrea

42

나는 여기에 인기가없는 것을 말할 수 있습니다 : id()비즈니스 로직에는 거의 사용되지 않는 다소 전문화 된 내장 함수입니다. 따라서 타이트하고 잘 작성된 함수에서 변수 이름으로 변수 이름을 사용할 때 문제가 발생하지 않습니다 .ID가 내장 함수를 의미하지 않는다는 것이 분명합니다.


1
> id 님은> 비즈니스 로직에서 거의 사용되지 않는 다소 전문화 된 내장 기능입니다. 따라서 id가 내장 함수를 의미하지는 않지만 명확하고 잘 작성된 함수에서 변수> 이름으로 변수를 사용하는 데 문제가 발생하지 않습니다. 이것이 사실이지만, 단순히 "id"보다이 변수 이름을 더 구체적으로 사용하는 것이 좋습니다. 많은 것들이 ID를 가지고 있으며 (특히 RDBMS를 사용하는 경우) Tim Peters의 Zen of Python 의 두 번째 줄에서 알 수 있듯이 :> 명시 적은 암시 적보다 낫습니다. 다음을 실행하여 나머지를 참조하십시오.import this
Ross

9
그래도 가능하다면 여전히 피할 것입니다. 동료의 불만을 듣지 않는 것 외에 다른 이유가 없더라도. :-)
Jason Baker

1
나는 작은 기능 (따라서 범위)에서 변수 "id"를 명명하는 것은 무해합니다. id어쨌든 내장을 사용하는 사람은 거의 없습니다 . 동료가 list내장 변수를 로컬 변수로 덮어 쓰는 데 시간이 걸렸다 고 말했습니다 . 따라서 다른 사람들이 언급 한 일반적인 규칙은 여전히 ​​타당합니다.
silviot

5

내장 함수 후에 변수 이름을 짓는 것은 좋지 않습니다. 그 이유 중 하나는 이름이 무시 된 독자에게 혼동 될 수 있기 때문입니다.


2

id파이썬의 내장 함수입니다. 값을 할당 id하면 기능이 무시됩니다. 에서처럼 접두사를 추가 some_id하거나에서와 같이 다른 대문자로 사용 하는 것이 가장 좋습니다 ID.

내장 함수는 단일 인수를 사용하여 전달한 오브젝트의 메모리 주소 (CPython에서)의 정수를 리턴합니다.

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

2
내장 함수를 건드리지 않는 클래스 속성 또는 메소드 이름을 'id'로 지정할 수 있습니다.
Toni Ruža


0

다른 사람들은 혼란 스럽다고 언급했지만 이유 를 확장하고 싶습니다 . 다음은 실제 사례를 기반으로 한 예입니다. 기본적으로 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_이 문제가 발생하지 않았을 것입니다.


-6

파이썬은 동적 언어이기 때문에 일반적으로 변수와 함수에 같은 이름을 부여하는 것은 좋지 않습니다. id ()는 파이썬의 함수이므로 id라는 변수를 사용하지 않는 것이 좋습니다. 그것을 염두에두고, 그것은 당신이 사용할 수있는 모든 함수에 적용됩니다 ... 변수는 함수와 이름이 같아서는 안됩니다.


3
"파이썬은 동적 인 언어이기 때문에 일반적으로 변수와 함수에 같은 이름을 부여하는 것은 좋은 생각이 아닙니다." -변수와 함수에 같은 이름을 지정할 수 없습니다. 역동적 인 언어와 관련이 없습니다. 동일한 범위의 다른 객체와 동일한 이름 을 속성 에 부여 하려는 경우 동의하지 않습니다. "Key"라는 클래스, "key"라는 클래스의 인스턴스 및 "key"라는 다른 객체의 속성 (예 : "door.key")이있을 수 있습니다.
Purrell
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.