python - 코딩 - 표준 모듈 이름과의 충돌을 피하기위한 파이썬 명명 규칙이 있습니까?



파이썬 doc (1)

PEP 8 에서는 파이썬 키워드와의 충돌을 피하기 위해 하나의 후행 밑줄을 사용하도록 권장하지만 표준 파이썬 모듈에 대한 모듈 이름과의 충돌은 어떨까요? 그것도 하나의 후행 밑줄이어야합니까?

나는 이런 것을 상상하고있다.

import time
time_ = time.time()

https://src-bin.com


Answer #1

PEP 8에서는 직접 언급하지 않습니다.

후행 밑줄은 분명히 키워드와 충돌 할 때 필요 합니다. 그렇지 않으면 코드가 SyntaxError 를 발생시킬 수 있습니다 (또는 실제로 불행한 경우 컴파일이 의도 한 것과 완전히 다른 의미로 컴파일 됨).

따라서 클래스에 이름을 지정하려는 클래스 속성, 인스턴스 속성, 함수 매개 변수 또는 로컬 변수가있는 컨텍스트에서도 class_ 와 함께 사용해야합니다.

그러나 같은 것은 time 이 맞지 않습니다. 그리고 나는 그러한 경우에, 당신 언더 스코어에 time 후행 해서는 안된다고 생각 time .

여기에는 stdlib의 여러 클래스 자체에 time 이라는 이름의 메소드 또는 데이터 속성이 있고 그 중 아무 것도 time_ 가지고 time_ 있습니다.

물론 모듈과 동일한 범위에서 이름을 생성하는 경우가 있습니다 (대개 전역 변수 또는 함수를 의미). 그런 다음 혼란에 빠질 가능성이 훨씬 더 높으며 현재 범위의 나머지 부분에 대해 time 모듈에서 액세스 할 수있는 기능을 숨 깁니다.

저는 90 %의 시간을 생각합니다. 그 대답은 "글로벌이되어서는 안됩니다"라고 생각합니다.

그러나 그것은 여전히 ​​다른 10 %를 남깁니다.

또한 이름 제한된 네임 스페이스에 있지만 네임 스페이스가 time 모듈에 액세스해야하는 함수 내부의 로컬 범위 인 경우도 있습니다.

아니면 길고 복잡한 기능 (어쨌든 가질 수는 없지만 때로는 당신이하는)에서. 인간 독자가 time 이 모듈 이라기보다는 지역이라는 것을 분명히 알지 못한다면, 그것은 해석자를 혼란스럽게하는 것만큼이나 나쁘다.

여기에서 남은 시간의 99 %가 "다른 이름을 선택하십시오"라고 생각합니다.

예를 들어 다음 코드를 살펴보십시오.

def dostuff(iterable):
    time = time.time()
    for thing in iterable:
        dothing(thing)
    return time.time() - time # oops!

분명한 대답은 변수 start 또는 t0 또는 다른 이름을 바꾸는 것입니다. 문제를 해결하는 것 외에도 더 의미있는 이름이기도합니다.

그러나 그것은 여전히 ​​1 %를 떠난다.

예를 들어, 프로토콜 사양이나 .NET 또는 ObjC 인터페이스에서 Python 코드를 생성하는 라이브러리가 있습니다.이 인터페이스는 이름이 사용자가 제어 할 수없는 곳입니다. 당신이 할 수있는 일은 번역 된 이름에 일종의 프로그램적이고 모호하지 않은 규칙을 적용하는 것입니다. 이 경우 stdlib 모듈 이름과 키워드를 _ 에 추가하는 규칙은 좋은 생각 일 수 있다고 생각합니다.

변수가 임의로 이름을 변경할 수없는 다른 예제를 생각해 볼 수 있으며 적어도 잠재적으로 time 모듈과 동일한 범위에 있어야합니다. 그런 경우에는 _ 접미사를 사용합니다.





naming-conventions