상수에 모두 대문자를 사용해야합니까?


34

나는 주로 소스 코드를 린팅하기 위해 pylint를 사용하는 Python 프로그래머입니다. 하나를 제외한 모든 경고를 제거 할 수 있습니다 : 상수의 잘못된 이름. 모든 대문자로 이름을 변경하면 문제가 해결되지만 실제로 그렇게해야합니까? 그렇게하면 대부분의 변수가 일정하므로 (pyintint에 따라) 코드가보기 흉하게 보입니다.


1
대부분의 변수가 모듈 수준 상수 인 경우 비정상적인 작업을 수행 한 것일 수 있습니다. 그들 대부분은 기능 안에서 살아야합니다.
RemcoGerlich

1
pylint가 상수라고 생각하는 코드 샘플을 보여 주시겠습니까?
Winston Ewert

@WinstonEwertNOTES_DIRECTORY = argv[1] chdir(NOTES_DIRECTORY) FILES = glob('*.txt') RAND_FILE = choice(FILES) with open(RAND_FILE) as notes_file: POINTS = notes_file.readlines() RAND_POINT = choice(POINTS)
Abhishek Kumar

@AbhishekKumar, 코드가 함수입니까, 아니면 최상위입니까?
Winston Ewert

@WinstonEwert 최상위 수준에서 PyLint의 지침을 따른 후.
Abhishek Kumar

답변:


33

아마도 다음과 같은 코드를 작성하고있을 것입니다.

notes_director = argv[1]
chdir(notes_director)
files = glob('*.txt')
rand_file = choice(files)
with open(rand_file) as notes_file: 
    points = notes_file.readlines() 
    rand_point = choice(points)

이 코드를 함수로 이동해야합니다.

def main():
    notes_director = argv[1]
    chdir(notes_director)
    files = glob('*.txt')
    rand_file = choice(files)
    with open(rand_file) as notes_file: 
        points = notes_file.readlines() 
        rand_point = choice(points)

# actually call the main function    
main()

Pylint는 실제로 작업을 수행하는 코드가 함수 안에 있다고 가정합니다. 함수 내부가 아니라 코드의 최상위에이 코드가 있기 때문에 혼동됩니다.

일반적으로 말하면 최상위 수준이 아닌 함수 내부에서 작업하는 것이 더 좋습니다. 이를 통해 수행중인 작업을보다 잘 구성하고 재사용 할 수 있습니다. 빠르고 더러운 스크립트에서는 함수 외부에서 알고리즘을 수행하는 코드 만 있어야합니다.


1
모듈 수준 변수를 사용해야하는 좋은 파이썬적인 이유가 많이 있다고 생각합니다. 나는이 조언이 PEP8을 잘못 읽는 pylint의 인공물 일 뿐이라고 생각하고, "상수는 모듈 수준이어야한다"라는 반대의 말도 사실이어야한다고 생각합니다.
MetricSystem

21

예. 상수 에 대한 PEP8 규칙에 따르면 :

상수는 일반적으로 모듈 수준에서 정의되며 단어를 구분하는 밑줄과 함께 모든 대문자로 작성됩니다. 예는 MAX_OVERFLOWand TOTAL입니다.

긴 버전 :

파이썬 커뮤니티에는 다른 많은 커뮤니티와 마찬가지로 코드 작성 방법에 대한 규칙이 있습니다. 이것은 작업 코드 와 다릅니다 . 상수를 모두 소문자로 작성하더라도 코드는 여전히 작동합니다.

그러나 pylint 와 같은 도구를 사용하여 "강제화 된"커뮤니티 합의가 있습니다 (PEP8에 문서화 됨) . 자신의 행복을 위해 프로그램한다면, pylint가 당신에게주는 힌트를 무시할 수 있습니다. 커뮤니티 외에 공개 교환을 원한다면, 본인 외에 다른 사람이 내 코드를 사용해야합니다«, PEP8에 따라 코드를 준비해야합니다.


7
반면에, pylint잘못 이해하는 것은 전적으로 가능합니다 . 파이썬은 상수가 항상 같은 값을 가질 것으로 예상되는 것 외에는 상수와 변수를 구별하는 방법을 제공하지 않습니다. pylint한 번만 설정 변경이 일정하지만,이 게 아니라면 이제까지하지 않습니다되는 것을 가정 위한 상수로, 그건 그냥 구현의 유물이 될 수 있습니다. 특히 질문에 대한 주석에 제공된 코드에는 각 실행마다 다른 값이 있으므로 pylint가 생각한다고해도 상수로 간주해서는 안됩니다.
Jules

@Jules 나는 한 번 설정된 변수를 호출하고 런타임 중에 변경되는 상수는 다시 상수가 없으므로 많은 언어 (예 : JS)의 const키워드 로 존재 합니다. 초기 값은 다르지만 maybe가 아닙니다 PI.
토마스 정크

1
불변 변수 (런타임에서 설정되고 변경되지 않은 변수 )와 상수 (즉, 모든 프로그램 실행에서 동일한 것)를 구별 하고 언어가 옵션을 제공하면 컴파일 타임에 계산할 수 있습니다 ) ... 요점은 파이썬에 대한 구별을 지정하는 방법이 없기 때문에 pylint전자가 경우에도 후자를 가정한다는 것입니다.
Jules

Pylint는 "상수는 모듈 수준이어야 함"이라고 말하고 반대의 "모듈 수준은 일정해야 함"이라고 가정한다는 점에서 잘못되었습니다. 그러나 그렇지 않으면 좋은 도구이기 때문에 유용한 도구가 붙어 있습니다.
MetricSystem

@MetricSystem 당신의 의견으로는 모듈 레벨 변수가 상수 이외의 기능은 무엇입니까? 변경 가능해야합니까?
토마스 정크

13

PEP8 및 Python 커뮤니티 표준은을 사용하는 것 ALL_CAPS_CONSTANTS입니다. C, Java, Perl, PHP, Python, bash 및 기타 프로그래밍 언어 및 셸 환경에서 수십 년 동안 사용 된 일반적인 시각적 단서입니다. 그러나 현대 온라인 어휘 에서 모든 캡은 소리를 의미 합니다. 그리고 소리 치는 것은 무례합니다.

그러나 파이썬은 다소 일관성이 없습니다 ALL_CAPS_CONSTANTS. JavaScript는 가지고 Math.PI있지만 Python에는 math.pi있습니다. π보다 더 잘 인식되거나 지속적인 상수는 없습니다. 또는 sys.version_info실행중인 Python 버전을 고려 하십시오. 프로그램의 수명 동안 100 %의 일정 - 지금까지보다 더 PORTMAX_ITERATIONS또는 다른 상수가 정의 것입니다. 아니면 sys.maxsize어때요? 플랫폼의 최대 고유 정수 값은 하나 또는 두 개의 프로그램 실행뿐만 아니라 하드웨어 수명 동안 일정합니다.

이러한 상수 경우 - π와 우주의 근본적인 상수 전자 같은 일부 포함하고, 모든 영원에 따라 변화하지 않을 것이다 - 경우 낮은 경우, 음 ... 그래서 할 수있는 다른 상수가 될 수 있습니다. 선택할 수 있습니다.

기억 PEP8는 스타일 가이드입니다. 법률이 아닌 지침. 파이썬의 표준 라이브러리조차도 종종 지침을 위반합니다. 그리고 또 다른 핵심 Python 지침 인 PEP20 ( "The Zen of Python")을 인용합니다 .

  • 못생긴 것보다 아름답다
  • 가독성
  • 실용성은 순도를 능가합니다.

프로그램의 실제 메모에 YELLY_CONSTANTSHOUTY_PARAMETER시작은 창살하기 위해서는 모든 대문자 상수는 일반적으로 정말 지속되지 않는 것을 기억하는 데 도움이 플라톤의 이상을 하지만, 프로그램 실행의 매개 변수를 설정합니다. 에 대한 진정 일정 아무것도 없다 PORT, SITENAME또는 NUMRUNS, 그들은 독립 프로그램 전역으로 관리 할 필요가 없습니다은. 예를 들어, 전역 적으로 액세스 가능한 프로그램 매개 변수 번들로 사전에 놓을 수 있습니다.

config = {
    'port': 80,
    'sitename': "Bubba's Blog",
    'numruns': 100,
}

파이썬에는 또한 훌륭한 키워드 매개 변수 전달 기능이있어 사용 필요성을 줄입니다 APPARENTLY_ANGRY_GLOBAL_VARIABLES.

def process_data(sitename, port=80, numruns=100):
    ...

process_data("Bubba's Blog")

실제로, 이러한 값 중 상당수는 구성 파일, OS 환경 변수, 명령 행 인수 또는 제어 소스 / 패턴 의 역전 을 만족시키기 위해 다른 소스에서 읽습니다 . 그러나 그것은 또 다른 하루에 대한 더 큰 이야기입니다.


1

예, 대부분의 프로그래밍 언어 (적어도 내가 사용하는 언어)에서 일반적입니다.

Google 링크 를 참조 하여 동일한 팀의 개발자간에 공통 스타일을 공유 할 수 있습니다 .

사용하는 것이 좋습니다

Type                  |Public          |Internal
Global/Class Constants|CAPS_WITH_UNDER |_CAPS_WITH_UNDER
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.