# https://wikidocs.net/20559
'''
02. 식별자(identifier)
1. 식별자(identifier)란?
변수, 상수, 함수, 사용자 정의 타입 등에서 다른 것들과 구분하기 위해서 사용되는 변수의 이름, 상수의 이름, 함수의 이름, 사용자 정의 타입의 이름 등 '이름'을 일반화 해서 지칭하는 용어입니다.
사용자가 임의로 지정합니다. 이름만 보아도 뜻을 알 수 있도록 지정하는 것이 좋습니다.

2. 식별자(identifier) 명칭의 작성 스타일
변수나 함수명 같은 식별자(identifier)의 명칭을 작성할 때 이름을 정의하는 것도 코딩 스타일 중 일부입니다. 대표적인 표기법은 다음 네 가지가 있습니다.

카멜 표기법(Camel Case)
여러 단어를 연달아 사용할 때 각 단어의 첫 글자를 대문자로 적되, 맨 앞에 오는 글자는 소문자로 표기하는 것입니다. 낙타의 등에 있는 혹과 같다고 하여 카멜(Camel) 표기법이라고 부릅니다. Java의 권장 표기법입니다.
예) camelVariable, firstName, lastName ...

파스칼 표기법(Pascal Case)
단어의 모든 앞글자를 대문자로 표기합니다. 카멜 표기법이 단봉낙타라면 파스칼은 쌍봉낙타라고 할 수 있습니다. 예) PascalVariable, FirstName, LastName ...

헝가리안 표기법(Hungarian Notation)
접두어에 자료형을 붙이는 표기법입니다. 요즈음은 잘 사용하지 않는 스타일입니다. 언어의 종류가 다양한 만큼 자료형도, 문서 데이터도 다양해졌기 때문에 접두어가 의미가 없어졌기 때문 입니다. 예) strName, bBusy, szName ...

스네이크 표기법(Snake Case)
단어 사이에 언더바를 넣어서 표기하는 방법입니다. 하지만 "_" 이나 "__"로 시작되는 식별자들은 많은 언어에서 확장으로 예약되어 있는 경우가 많으므로 사용하지 않는 것이 관례입니다.

대부분의 경우 카멜 기법과 파스칼 표기법을 적절하게 조합하여, 변수명이나 함수명은 카멜 표기법을 따르고 클래스명은 파스칼 표기법을 따르는 작성 스타일, 혹은 변수명은 카멜로 표기하고 함수와 클래스명은 파스칼로 표기하는 작성 스타일이 대세입니다. 전자는 Java, 후자는 C++에서 주로 볼 수 있는 스타일이다. 언어에 따라 전부 카멜, 전부 파스칼로 표기할 것을 권장하기도 합니다.

3. Style Guide for Python Code
Python에서는 https://www.python.org/dev/peps/pep-0008/ 에 "Style Guide for Python Code"를 기술하고 있습니다. 위의 내용을 간단하게 설명하면 다음과 같습니다.

코드 배치
들여쓰기는 공백 4칸을 권장합니다.
한 줄은 최대 79자까지
최상위(top-level) 함수와 클래스 정의는 2줄씩 띄어 씁니다.
클래스 내의 메소드 정의는 1줄씩 띄어 씁니다.
표현식과 구문의 공백
다음과 같은 곳의 불필요한 공백은 피합니다.
대괄호([])와 소괄호(())안의 공백은 피합니다.
쉼표(,), 쌍점(:)과 쌍반점(;) 앞의 공백은 피합니다.
키워드 인자(keyword argument)와 인자의 기본값(default parameter value)의 = 는 붙여 씁니다.
주석
코드와 모순되는 주석은 없느니만 못합니다. 항상 코드에 따라 갱신해야 합니다.
불필요한 주석은 달지 마세요.
한 줄 주석은 신중히 다세요.
문서화 문자열(Docstring)에 대한 컨벤션은 PEP 257을 참고하세요.
이름 지정 규칙
변수명에서 _(밑줄)은 위치에 따라 다음과 같은 의미가 있습니다.
1개의 밑줄로 시작 : 내부적으로 사용되는 변수
1개의 밑줄로 종료 : 파이썬 기본 키워드와 충돌을 피하려고 사용
2개의 밑줄로 시작 : 클래스 속성으로 사용
2개의 밑줄로 종료 : 사용자가 조정할 수 있는 네임스페이스 안의 속성
소문자 L, 대문자 O, 대문자 I는 변수명으로 사용하지 마세요
모듈(Module) 명은 짧은 소문자로 구성되며 필요하다면 밑줄로 나눕니다.
모듈은 파이썬 파일(.py)에 대응하기 때문에 파일 시스템의 영향을 받으니 주의하세요.
C/C++ 확장 모듈은 밑줄로 시작합니다.
클래스명은 카멜케이스(CamelCase)로 작성합니다.
내부적으로 쓰이면 밑줄을 앞에 붙입니다.
예외(Exception)는 실제로 에러인 경우엔 “Error”를 뒤에 붙입니다.
함수명은 소문자로 구성하되 필요하면 밑줄로 나눕니다.
대소문자 혼용은 이미 흔하게 사용되는 부분에 대해서만 하위호환을 위해 허용합니다.
메소드명은 함수명과 같으나 비공개(non-public) 메소드, 혹은 변수면 밑줄을 앞에 붙입니다.
서브 클래스(sub-class)의 이름 충돌을 막기 위해서는 밑줄 2개를 앞에 붙입니다.
상수(Constant)는 모듈 단위에서만 정의하며 모두 대문자에 필요하다면 밑줄로 나눕니다.
프로그래밍 권장 사항
코드는 될 수 있으면 PyPy, Jython, IronPython등에서도 불이익이 없게끔 작성되어야 합니다.
None을 비교할때는 is나 is not만 사용합니다.
클래스 기반의 예외를 사용하세요.
모듈이나 패키지에 자기 도메인에 특화된(domain-specific)한 기반 예외 클래스(base exception class)를 빌트인(built-in)된 예외를 서브클래싱해 정의하는게 좋습니다. 이 때 클래스는 항상 문서화 문자열을 포함해야 합니다.
raise ValueError('message')가 (예전에 쓰이던) raise ValueError, 'message' 보다 좋습니다.
예외를 except:로 잡기보단 명확히 예외를 명시합니다.(ex. except ImportError:
try: 블록의 코드는 필요한 것만 최소한으로 작성합니다.
string 모듈보다는 string 메소드를 사용합니다. 메소드는 모듈보다 더 빠르고, 유니코드 문자열에 대해 같은 API를 공유합니다.
접두사나 접미사를 검사할 때는 startswith()와 endwith()를 사용합니다.
객체의 타입을 비교할 때는 isinstance()를 사용합니다.
빈 시퀀스(문자열, 리스트(list), 튜플(tuple))는 조건문에서 거짓(false)입니다.
불린형(boolean)의 값을 조건문에서 ==를 통해 비교하지 마세요.
4. 식별자 작성 규칙
식별자는 소문자 (a ~ z) 또는 대문자 (A ~ Z) 또는 숫자 (0 ~ 9) 또는 밑줄 (_)의 조합입니다.
myClass, var_1및 print_this_to_screen 모두 유효한 예입니다.
식별자는 숫자로 시작될 수 없습니다. 1variable무효이지만 variable1완벽하게 괜찮습니다.
키워드는 식별자로 사용할 수 없습니다.
!, @, #, $, % 등 특수 기호는 우리 식별자에서 사용할 수 없습니다.
식별자의 길이는 제한이 없습니다.
파이썬은 대소 문자를 구별하는 언어입니다. 이는, Variable과 variable동일하지 않습니다.
의미있는 식별자의 이름을 항상 지정하십시오.

'''