당신은 멋쟁이, 우리는 장고쟁이~

0%

PEP8 Programming Recommendations - 3편

프로그래밍 권장사항들 - 3편


운영체체 에러를 잡아낼때에는,

파이썬 3.3 이후에서 소개된 명시적인 예외 상화관계를 사용합니다



모든 try/except구문


모든 try/except절에 대해 try 절을 필요한 최소의 코드 양으로 사용 제한을 합니다. 버그가 가려지는걸 피할수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 좋은예 
try:
value = collection[key]
except KeyError:
return key_not_found(key)
else:
return handle_value(value)

# 나쁜예
try:
# 너무 광범위함
return
handle_value(collection[key])
except KeyError:
# Will also catch KeyError raised by handle_value()
return key_not_found(key)


특정 코드 섹션에 로컬 자원


자원이 특정 코드 섹션에 대해 로컬로 있을때에는 with문을 사용하여, 사용후 빠르고 안정적으로 정리되도록 합니다. try/finally 구문도 허용됩니다.


Context Manager


자원을 확보하거나 해제 하는것이 아닌 경우의 컨텍스트 메니져는 분리된 함수 혹은 메써드를 통해서 호출 되어야 합니다.


1
2
3
4
5
6
7
# 좋은예 
with conn.begin_transaction():
do_stuff_in_transaction(conn)

# 나쁜예
with conn:
do_stuff_in_trnasaction(conn)

후의 예시는, __enter____exit__ 메서드가 트랜셕션 후 연결을 닫는 것 이외의 작업을 수행하고 있음을 나타내는 정보를 제공하지 않습니다.



이 경우에는 명시적인게 중요합니다.


리턴 구문안에서는 일관성이 있어야 합니다



함수안에 모든 리턴 구문은 수식을 반환해야 합니다. 만약 어떤 리턴 구문이 수식을 반환할때. 어떠한 값이 없는 리턴 구문은 명시적으로, return None 이라고 해주어야 합니다.


그리고, 명시적인 리턴 구문은 함수의 마지막에 존재해야 합니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 좋은예 

def foo(x):
if x >= 0:
return math.sqrt(x)
else:
return None

def bar(x):
if x < 0:
return None
return math.sqrt(x)

# 나쁜예

def foo(x):
if x >= 0:
return math.sqrt(x)

def bar(x):
if x < 0:
return
return math.sqrt(x)


문자열 모듈보다는 문자열 메써드 사용


문자열 메써드는 언제나 빠르고, 유니코드 문자와 함께 같은 API 를 공유합니다.



startswith()endwith()



접두사와 접미사를 확인하기 위해서는, 문자열 슬라이싱 보다 startswith()endwith() 를 사용합니다.


startswith()endswith()가 더 깔끔하고 에러가 적습니다.



1
2
3
4
5
# 좋은예 
if foo.startswith('bar'):

# 나쁜예
if foo[:3] == 'bar'


객체 타입 비교는 isinstance() 사용



객체 타입 비교를 할때는, 직접 타입 비교를 하기 보다는 isinstance()를 사용합니다.


1
2
3
4
5
# 좋은예 
if isinstance(obj, int);

# 나쁜예
if type(obj) is type(1):


객체가 문자열인지 아닌지 확인할때에는, 그것이 유니코드 문자열일수도 있다는것을 염두해 두세요.

파이썬2 에서는, strunicode는 같은 베이스 클래스, basestring을 가지고 있습니다.

따라서, 아래와 같이 쓸수 있습니다.

1
2
# Python2 
if isinstance(obj, basestring)


파이썬3 에서는, unicodebasestring은 존재하지 않습니다. str만 존재하고

bytes객체는 더이상 문자열 종류가 아닙니다.


시퀀스들(문자열, 리스트, 튜플) 빈 시퀀스는 False 를 반환합니다



1
2
3
4
5
6
7
# 좋은예 
if not seq:
if seq:

# 나쁜예
if len(seq):
if not len(seq):


마치며..



프로그래밍 권장 사항들이 꽤 많네요.


나머지 권장 사항들은 다음 포스팅에 이어서 쓰겠습니다.