Skip to content

Commit 2eb4cec

Browse files
committed
merge 3
1 parent 7ff94ef commit 2eb4cec

25 files changed

Lines changed: 3464 additions & 2210 deletions

Google Python Style Guide kor.md

Lines changed: 1298 additions & 16 deletions
Large diffs are not rendered by default.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Google Python Style Guide
2+
3+
## 번역
4+
5+
- Contributors : [`0113bernoyoun`](https://github.com/0113bernoyoun)
6+
- Log
7+
- 초안 : 2019.12.10
8+
9+
## 1 배경
10+
11+
- Python은 구글에서 메인으로 사용하는 동적 언어입니다.
12+
- 이 스타일 가이드는 Python 프로그램에서 *해야할 것들과 하지 말아야할 것* 들을 적어놓았습니다.
13+
- 코드 형식을 정확하게 하는 것들 돕기 위해, 우리는 [settings file for Vim](google_python_style.vim)을 만들었습니다.
14+
- Emacs 편집기에서는 기본 설정값으로 사용하면 됩니다.
15+
- 많은 팀에서 형식에 대한 논쟁을 피하기 위해 [yapf](https://github.com/google/yapf/) auto-formatter 을 사용합니다.

Google Python Style Guide/2. Python 언어 규칙/ch2_readMe.md renamed to Google Python Style Guide/2. Python 언어 규칙/ReadMe.md

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Google Python Style Guide
22

3+
## 번역
4+
5+
- Contributors : [`0113bernoyoun`](https://github.com/0113bernoyoun), [`Sotaneum`](https://github.com/Sotaneum), [`denmark111`](https://github.com/denmark111)
6+
- Log
7+
- 초안 : 2019.12.10
8+
39
## 2. Python 언어 규칙
410

511
### 2.1 Lint
@@ -94,8 +100,8 @@
94100
echo.EchoFilter(input, output, delay=0.7, atten=4)
95101
```
96102

97-
- import된것들과 관련있는 이름을 사용하지마세요.
98-
- 모듈이 같은 패키지에 있더라도 전체 패키지 이름을 사용하세요.
103+
- import된것들과 관련있는 이름을 사용하지마세요.
104+
- 모듈이 같은 패키지에 있더라도 전체 패키지 이름을 사용하세요.
99105
- 이는 무심코 패키지를 두번 import 하는것을 예방하는 것에 도움이 됩니다. 다만 [typing 모듈](#typing-imports) 를 import할때는 이러한 규칙들에서 예외될 수 있습니다.
100106

101107
### 2.3 Packages
@@ -157,7 +163,7 @@
157163
#### 2.4.2 장점
158164

159165
- 일반적인 연산자에 대한 제어흐름은 에러 핸들링 코드에 의해 난잡해지지 않습니다.
160-
- 특정 조건이 발생했을 때 제어 흐름이 몇몇 프레임들을 생략할 수 있습니다.
166+
- 특정 조건이 발생했을 때 제어 흐름이 몇몇 프레임들을 생략할 수 있습니다.
161167
- 예를 들어, N이라는 중첩된 함수에서 앞으로 돌아가는 것 대신, 에러코드를 전달합니다.
162168

163169
#### 2.4.3 단점
@@ -170,7 +176,7 @@
170176

171177
- `raise MyError('Error message')` 또는 `raise MyError()` 같이 예외를 발생시킵니다.
172178
- 두개의 인자를 가지는 형식을 사용하지 않습니다. (`raise Myerror, 'Error message'`).
173-
- 적절한 경우 내장 예외 클래스를 사용하세요.
179+
- 적절한 경우 내장 예외 클래스를 사용하세요.
174180
- 예를 들어, 만약 양수를 예상하는데 음수가 통과한다면 `ValueError`를 발생시는 것이 그 예입니다.
175181
- 공공 API에 있는 인수의 값을 검증하기 위해 `assert`문을 사용하지마세요.
176182
- `assert`는 올바른 사용이나 예상치 못한 이벤트 발생을 나타내는 것이 아니라 내부적 정확성을 보장하기 위해 사용됩니다. 만약 나중에 예외가 필요하다면, raise문을 실행하세요.
@@ -486,7 +492,7 @@
486492

487493
#### 2.12.3 단점
488494

489-
- 기본 인자값은 모듈이 불러올 때 한번 계산됩니다.
495+
- 기본 인자값은 모듈이 불러올 때 한번 계산됩니다.
490496
- 인자값이 list나 dictionary 같은 경우 변형이 가능한 Object이면 문제를 일으킬 수 있습니다.
491497
- 만약에 함수가 Object를 수정하는 경우(list에 item을 추가하는 경우) 기본값이 수정됩니다.
492498

@@ -605,7 +611,7 @@
605611

606612
#### 2.14.1 정의
607613

608-
- Python은 boolean문에서 특정 값을 `False`으로 평가합니다.
614+
- Python은 boolean문에서 특정 값을 `False`으로 평가합니다.
609615
- 빠른 "거짓의 법칙"은 모든 "비어있는" 값을 `False`으로 간주되므로 `0, None, [], {}, ''`은 boolean문에서는 `False`으로 평가합니다.
610616

611617
#### 2.14.2 장점
@@ -618,7 +624,7 @@
618624

619625
#### 2.14.4 결론
620626

621-
- 가능하다면 "암묵적(implicit)" `False`를 사용하세요. (e.g. `if foo != []:` 보다는 `if foo:` 가 좋습니다.)
627+
- 가능하다면 "암묵적(implicit)" `False`를 사용하세요. (e.g. `if foo != []:` 보다는 `if foo:` 가 좋습니다.)
622628
- 그러나 몇가지 주의 사항을 명심해야합니다.
623629
- `None` 개체를 비교할 때 `==` 이나 `!=` 대신 `is``is not`를 사용해야합니다.
624630
- `if x is not None:`의 의미를 원할 때 `if x:`를 쓰는 것을 주의해야합니다.
@@ -702,7 +708,7 @@
702708
#### 2.16.1 정의
703709
704710
- 중첩된 Python 함수는 주변 함수에 정의된 변수를 참조할 수 있지만 할당할 수 없습니다.
705-
- 변수 바인딩은 렉시컬 스코핑(Lexical Scoping)를 사용하여 해결합니다. 즉, 정적 프로그램 텍스트를 기반으로 합니다.
711+
- 변수 바인딩은 렉시컬 스코핑(Lexical Scoping)를 사용하여 해결합니다. 즉, 정적 프로그램 텍스트를 기반으로 합니다.
706712
- 블록 내에 할당된 모든 이름은 Python이 해당 이름에 대한 모든 참조를 할당에 앞서 사용하더라도 로컬 변수로 처리하게 할 것입니다. 만약에 전역 변수가 발생하면 그 이름은 전역 변수로 취급합니다.
707713
708714
- 이 기능에 대해 사용예는 다음과 같습니다.
@@ -750,7 +756,7 @@
750756
#### 2.17.1 정의
751757
752758
- [함수와 메서드를 위한 Decorators 입니다.](https://docs.python.org/3/glossary.html#term-decorator) ("`@` 표기법"으로 알려져있습니다).
753-
- 일반적인 decorator 중 하나는 메서드를 동적으로 계산한 속성으로 변환하는 데 사용하는 `@property`가 있습니다. 그러나 decorator는 사용자 정의 decorator도 허용하고 있습니다.
759+
- 일반적인 decorator 중 하나는 메서드를 동적으로 계산한 속성으로 변환하는 데 사용하는 `@property`가 있습니다. 그러나 decorator는 사용자 정의 decorator도 허용하고 있습니다.
754760
- 특히 이 `my_decorator` 함수 처럼 할 수 있습니다
755761
756762
```python

Google Python Style Guide/3. Python 스타일 규칙/3.1 세미콜론.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
<a id="semicolons"></a>
33
### 3.1 Semicolons
44

5-
세미콜론을 이용해서 문장을 끝내거나 한 줄에 2개의 구문을 작성하지 마세요.
5+
- 세미콜론을 이용해서 문장을 끝내거나 한 줄에 2개의 구문을 작성하지 마세요.

Google Python Style Guide/3. Python 스타일 규칙/3.10 문자열.md

Lines changed: 96 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -2,79 +2,106 @@
22
<a id="strings"></a>
33
### 3.10 Strings
44

5-
매개변수가 모두 문자열인 경우에도 `format` 메소드나 `%` 연산자를 사용하여 포메팅하세요.
6-
물론 `+``%` 를 언제 사용할지는 개발자의 판단에 따릅니다.
7-
8-
```python
9-
올바른 예시: x = a + b
10-
x = '%s, %s!' % (imperative, expletive)
11-
x = '{}, {}'.format(first, second)
12-
x = 'name: %s; score: %d' % (name, n)
13-
x = 'name: {}; score: {}'.format(name, n)
14-
x = f'name: {name}; score: {n}' # Python 3.6+
15-
```
16-
17-
```python
18-
잘못된 예시: x = '%s%s' % (a, b) # use + in this case
5+
- 매개변수가 모두 문자열인 경우에도 `format` 메소드나 `%` 연산자를 사용하여 포메팅하세요.
6+
- 물론 `+``%` 를 언제 사용할지는 개발자의 판단에 따릅니다.
7+
8+
- 올바른 예
9+
10+
```python
11+
x = a + b
12+
x = '%s, %s!' % (imperative, expletive)
13+
x = '{}, {}'.format(first, second)
14+
x = 'name: %s; score: %d' % (name, n)
15+
x = 'name: {}; score: {}'.format(name, n)
16+
x = f'name: {name}; score: {n}' # Python 3.6+
17+
```
18+
19+
- 부적절한 예
20+
21+
```python
22+
x = '%s%s' % (a, b) # use + in this case
1923
x = '{}{}'.format(a, b) # use + in this case
2024
x = first + ', ' + second
2125
x = 'name: ' + name + '; score: ' + str(n)
22-
```
23-
24-
반목문에서 `+``+=` 연산자를 사용하여 문자열을 누적하는 행위는 삼가세요.
25-
문자열은 변형이 불가하기 때문에 위와 같은 연산자를 사용하는 것은 불필요한 임시 오브젝트를 생성하게 되고
26-
결국 리니어한 실행시간이 아닌 제곱형태의 실행시간이 소요됩니다.
27-
위의 연산자 대신 리스트에 문자열을 넣고 반복문이 종료되면 `''.join` 를 사용하는것이 더 바람직합니다.
28-
(또는 각각의 문자열을 `io.BytesIO` 버퍼에 기록하는 것도 방법입니다.)
29-
30-
```python
31-
올바른 예시: items = ['<table>']
32-
for last_name, first_name in employee_list:
33-
items.append('<tr><td>%s, %s</td></tr>' % (last_name, first_name))
34-
items.append('</table>')
35-
employee_table = ''.join(items)
36-
```
37-
38-
```python
39-
잘못된 예시: employee_table = '<table>'
26+
```
27+
28+
- 반목문에서 `+``+=` 연산자를 사용하여 문자열을 누적하는 행위는 삼가세요.
29+
- 문자열은 변형이 불가하기 때문에 위와 같은 연산자를 사용하는 것은 불필요한 임시 오브젝트를 생성하게 되고 결국 리니어한 실행시간이 아닌 제곱형태의 실행시간이 소요됩니다.
30+
- 위의 연산자 대신 리스트에 문자열을 넣고 반복문이 종료되면 `''.join` 를 사용하는것이 더 바람직합니다. (또는 각각의 문자열을 `io.BytesIO` 버퍼에 기록하는 것도 방법입니다.)
31+
32+
- 올바른 예
33+
34+
```python
35+
items = ['<table>']
36+
for last_name, first_name in employee_list:
37+
items.append('<tr><td>%s, %s</td></tr>' % (last_name, first_name))
38+
items.append('</table>')
39+
employee_table = ''.join(items)
40+
```
41+
42+
- 부적절한 예
43+
44+
```python
45+
employee_table = '<table>'
4046
for last_name, first_name in employee_list:
4147
employee_table += '<tr><td>%s, %s</td></tr>' % (last_name, first_name)
4248
employee_table += '</table>'
43-
```
44-
45-
하나의 파일에는 따옴표를 일관되게 사용하세요. `'` 또는 `"` 중 하나를 선택하고 그것만 사용하세요.
46-
다만 `\\` 사용을 피하기 위해 같은 파일이더라도 다른 따옴표를 사용하는 것은 괜찮습니다. `gpylint` 가 이를 검사합니다.
47-
48-
```python
49-
올바른 에시:
50-
Python('Why are you hiding your eyes?')
51-
Gollum("I'm scared of lint errors.")
52-
Narrator('"Good!" thought a happy Python reviewer.')
53-
```
54-
55-
```python
56-
잘못된 예시:
57-
Python("Why are you hiding your eyes?")
58-
Gollum('The lint. It burns. It burns us.')
59-
Gollum("Always the great lint. Watching. Watching.")
60-
```
61-
62-
다수의 문장을 이용할 때는 `'''` 보단 `"""` 를 이용하세요.
63-
프로젝트에 따라 docstring이 아닌 다른 여러줄의 문자열을 `'''` 를 이용하여 작성할 수 있습니다.
64-
docstring은 상황과 무관하게 `"""` 를 사용합니다.
65-
여러줄의 문자열은 나머지 코드의 들여쓰기와 잘 호환되지 않기에
66-
종종 묵시적인 라인결합 방식을 사용하는 것이 전체적으로 더 깔끔해 보인다는 점을 알아두세요.
67-
68-
```python
69-
올바른 예시:
70-
print("This is much nicer.\n"
71-
"Do it this way.\n")
72-
```
73-
74-
```python
75-
잘못된 예시:
76-
print("""This is pretty ugly.
77-
Don't do this.
78-
""")
79-
```
49+
```
50+
51+
- 하나의 파일에는 따옴표를 일관되게 사용하세요. `'` 또는 `"` 중 하나를 선택하고 그것만 사용하세요.
52+
- 다만 `\\` 사용을 피하기 위해 같은 파일이더라도 다른 따옴표를 사용하는 것은 괜찮습니다. `gpylint` 가 이를 검사합니다.
53+
54+
- 올바른 예
55+
56+
```python
57+
Python('Why are you hiding your eyes?')
58+
Gollum("I'm scared of lint errors.")
59+
Narrator('"Good!" thought a happy Python reviewer.')
60+
```
61+
62+
- 부적절한 예
63+
64+
```python
65+
Python("Why are you hiding your eyes?")
66+
Gollum('The lint. It burns. It burns us.')
67+
Gollum("Always the great lint. Watching. Watching.")
68+
```
69+
70+
- 다수의 문장을 이용할 때는 `'''` 보단 `"""` 를 이용하세요.
71+
- 프로젝트에 따라 docstring이 아닌 다른 여러줄의 문자열을 `'''` 를 이용하여 작성할 수 있습니다.
72+
- docstring은 상황과 무관하게 `"""` 를 사용합니다.
73+
- 여러줄의 문자열은 나머지 코드의 들여쓰기와 잘 호환되지 않기에 종종 묵시적인 라인결합 방식을 사용하는 것이 전체적으로 더 깔끔해 보인다는 점을 알아두세요.
74+
- If you need to avoid embedding extra space in the string, use either concatenated single-line strings or a multi-line string with [`textwrap.dedent()`](https://docs.python.org/3/library/textwrap.html#textwrap.dedent) to remove the initial space on each line
75+
76+
- 부적절한 예
77+
78+
```python
79+
long_string = """This is pretty ugly.
80+
Don't do this.
81+
"""
82+
```
83+
84+
- 올바른 예
85+
86+
```python
87+
long_string = """This is fine if your use case can accept
88+
extraneous leading spaces."""
89+
```
90+
91+
```python
92+
long_string = ("And this is fine if you can not accept\n" +
93+
"extraneous leading spaces.")
94+
```
95+
96+
```python
97+
long_string = ("And this too is fine if you can not accept\n"
98+
"extraneous leading spaces.")
99+
```
100+
101+
```python
102+
import textwrap
80103
104+
long_string = textwrap.dedent("""\
105+
This is also fine, because textwrap.dedent()
106+
will collapse common leading spaces in each line.""")
107+
```

Google Python Style Guide/3. Python 스타일 규칙/3.11 파일과 소켓.md

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,35 @@
22
<a id="files-and-sockets"></a>
33
### 3.11 Files and Sockets
44

5-
파일과 소켓의 사용이 끝나면 명시적으로 연결을 종료해주세요.
5+
- 파일과 소켓의 사용이 끝나면 명시적으로 연결을 종료해주세요.
66

7-
파일이나 소켁과 같은 file-like 객체를 불필요하게 열어둔체로 남겨놓는것은 아래와 같은 단점들이 있습니다:
7+
- 파일이나 소켁과 같은 file-like 객체를 불필요하게 열어둔체로 남겨놓는것은 아래와 같은 단점들이 있습니다:
88

9-
- 파일 디스크립터와 같은 제한된 시스템 자원을 소모합니다.
10-
이러한 객체들을 많이 이용하는 코드라면 사용 후 시스템에 곧바로 반납하지 않는 행위는 자원의 고갈로 이어질 수 있습니다.
11-
- 파일을 열어둔 채로 방치하는 것은 파일의 이동이나 제거가 불가능 할 수 있습니다.
12-
- 공유되는 파일이나 소켓의 경우 이용 종료 후에 다른 프로그램에 의해 의도치 않게 읽어지거나 쓰여질 수 있습니다.
9+
- 파일 디스크립터와 같은 제한된 시스템 자원을 소모합니다.
10+
- 이러한 객체들을 많이 이용하는 코드라면 사용 후 시스템에 곧바로 반납하지 않는 행위는 자원의 고갈로 이어질 수 있습니다.
11+
- 파일을 열어둔 채로 방치하는 것은 파일의 이동이나 제거가 불가능 할 수 있습니다.
12+
- 공유되는 파일이나 소켓의 경우 이용 종료 후에 다른 프로그램에 의해 의도치 않게 읽어지거나 쓰여질 수 있습니다.
1313

14-
더욱이, 파일이나 소켓은 객체가 소멸될 때 자동으로 닫혀지는 것은 맞으나 객체의 수명주기를 파일의 상태에 구속하는 것은 나쁜 습관입니다:
14+
- 더욱이, 파일이나 소켓은 객체가 소멸될 때 자동으로 닫혀지는 것은 맞으나 객체의 수명주기를 파일의 상태에 구속하는 것은 나쁜 습관입니다:
1515

16-
- 런타임이 언제 파일의 소멸자를 호출하는지 보장 할 수 없습니다.
17-
지연된 Garbage Collection 과 같이 파이썬의 종류에 따라 다른 방식의 메모리 관리 기법을 사용하기에
18-
객체의 수명주기가 임의의 또는 영원히 지속될 수 있습니다.
19-
- globals 또는 예외추적 과 같이 의도치 않은 파일의 참조는 본래 수명보다 더 오랫동안 유지시킬 수 있습니다.
16+
- 런타임이 언제 파일의 소멸자를 호출하는지 보장 할 수 없습니다.
17+
- 지연된 Garbage Collection 과 같이 파이썬의 종류에 따라 다른 방식의 메모리 관리 기법을 사용하기에 객체의 수명주기가 임의의 또는 영원히 지속될 수 있습니다.
18+
- globals 또는 예외추적 과 같이 의도치 않은 파일의 참조는 본래 수명보다 더 오랫동안 유지시킬 수 있습니다.
2019

21-
가장 선호되는 파일관리 방식은 ["with" 구문](http://docs.python.org/reference/compound_stmts.html#the-with-statement) 입니다:
20+
- 가장 선호되는 파일관리 방식은 ["with" 구문](http://docs.python.org/reference/compound_stmts.html#the-with-statement) 입니다
2221

23-
```python
24-
with open("hello.txt") as hello_file:
25-
for line in hello_file:
26-
print(line)
27-
```
22+
```python
23+
with open("hello.txt") as hello_file:
24+
for line in hello_file:
25+
print(line)
26+
```
2827

29-
"with" 구문을 지원하지 않는 file-like 객체는 다음을 사용하세요.
30-
`contextlib.closing()`:
28+
- "with" 구문을 지원하지 않는 file-like 객체는 `contextlib.closing()`을 사용하세요.
3129

32-
```python
33-
import contextlib
34-
35-
with contextlib.closing(urllib.urlopen("http://www.python.org/")) as front_page:
36-
for line in front_page:
37-
print(line)
38-
```
30+
```python
31+
import contextlib
3932

33+
with contextlib.closing(urllib.urlopen("http://www.python.org/")) as front_page:
34+
for line in front_page:
35+
print(line)
36+
```

Google Python Style Guide/3. Python 스타일 규칙/3.12 TODO 주석.md

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,18 @@
22
<a id="todo-comments"></a>
33
### 3.12 TODO Comments
44

5-
임시적, 잠시 사용하려는 코드 또는 좋기는 하지만 완벽하지 않은 코드의 경우 `TODO` 주석을 사용하세요.
5+
- 임시적, 잠시 사용하려는 코드 또는 좋기는 하지만 완벽하지 않은 코드의 경우 `TODO` 주석을 사용하세요.
66

7-
`TODO` 주석은 대문자로 되어있는 `TODO` 문구로 시작하며 해당 코드에 대한 가장 높은 이해도를 가진 인물의
8-
이름, 이메일 주소 또는 다른 신원구분 문구를 괄호안에 넣어 포함하여야 합니다.
9-
이것 뒤에 무엇을 해야하는 지에 대한 내용을 추가합니다.
7+
- `TODO` 주석은 대문자로 되어있는 `TODO` 문구로 시작하며 해당 코드에 대한 가장 높은 이해도를 가진 인물의 이름, 이메일 주소 또는 다른 신원구분 문구를 괄호안에 넣어 포함하여야 합니다.
8+
- 이것 뒤에 무엇을 해야하는 지에 대한 내용을 추가합니다.
109

11-
목적은 `TODO`가 일관된 형식을 이용하여 추후 필요한 세부정보를 검색할 수 있어야 한다는 것입니다.
12-
`TODO` 는 본인이 아닌 다른 개발자가 문제를 해결하겠다는 약속이 아닙니다.
13-
따라서 `TODO` 를 만드셨다면 거의 항상 작성한 본인의 이름이 들어가야 합니다.
10+
- 목적은 `TODO`가 일관된 형식을 이용하여 추후 필요한 세부정보를 검색할 수 있어야 한다는 것입니다.
11+
- `TODO` 는 본인이 아닌 다른 개발자가 문제를 해결하겠다는 약속이 아닙니다.
12+
- 따라서 `TODO` 를 만드셨다면 거의 항상 작성한 본인의 이름이 들어가야 합니다.
1413

1514
```python
1615
# TODO(kl@gmail.com): Use a "*" here for string repetition.
1716
# TODO(Zeke) Change this to use relations.
1817
```
1918

20-
만약 작성한 `TODO` 가 "추후 무엇을 진행할 것" 이라는 형식을 담고 있다면 반드시
21-
("2009년 11월까지") 와 같은 구체적인 기간이나 ("모든 클라이언트가 XML 요청을 해결 할수 있을때 이 코드 삭제")
22-
처럼 목적을 포함하여야 합니다.
19+
- 만약 작성한 `TODO` 가 "추후 무엇을 진행할 것" 이라는 형식을 담고 있다면 반드시 ("2009년 11월까지") 와 같은 구체적인 기간이나 ("모든 클라이언트가 XML 요청을 해결 할수 있을때 이 코드 삭제") 처럼 목적을 포함하여야 합니다.

0 commit comments

Comments
 (0)