<aside> 💡 주의! 독자가 강조하고 싶거나 몰랐던 부분만 정리된 것이라서 해당 내용은 책 전체를 대표하지 못합니다. 아는 것은 복습 차원에서, 몰랐던 것은 새로 알아가는 용도로 활용하길 바랍니다.
</aside>
한 번 읽고 갑시다.
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
명확한 코드는 암시적인 코드보다 낫다.
단순한 코드가 복잡한 코드보다 낫다.
복잡한 코드가 난해한 코드보다 낫다.
단조로운 코드가 복잡한 코드보다 낫다.
읽기 쉬운 코드는 읽기 어려운 코드보다 낫다.
가독성은 중요하다.
규칙을 깰 정도로 특별한 경우란 없다.
하지만 실용성은 이상을 능가한다.
에러를 결코 조용히 넘어가지 않도록 한다.
명시적으로 조용히 넘어가라고 하더라도 조용히 넘어가지 않는다.
모호한 코드를 대면할 때마다 추측하고 싶은 유혹을 거절하라.
문제를 해결할 단 하나의 명확하고 바람직한 방법이 있을 것이다.
하지만 처음에 코딩을 할 때는 잘 모를 수 있기에 코드의 동작 방법을 정확히 알지 못할 수 있다.
아무것도 안 하는 것보다 지금 하는 게 낫다.
하지만 아무것도 하지 않는 것이 지금 당장 하는 것보다 나을 수도 있다.
설명하기 어려운 구현이라면 좋은 아이디어는 아니다.
쉽게 설명할 수 있는 구현이라면 좋은 아이디어일 것이다.
네임스페이스는 매우 훌륭한 아이디어이다. 많이 사용하자
def delete_product(prod_id, user):
assert user.is_admin(), 'Must be admin'
assert store.has_product(prod_id), 'Unknown product'
store.get_product(prod_id).delete()
_var
# my_module.py:
def _internal_func():
return 42
# test.py:
from my_module import *
print(_internal_func())
def _internal_func():
return 52
var_
__name
class Test:
def __init__(self):
self.foo = 11
self._bar = 23
self.__baz = 42
class ExtendedTest(Test):
def __init__(self):
super().__init__()
self.foo = 'overridden'
self._bar = 'overridden'
self.__baz = 'overridden'
t2 = ExtendedTest()
QUIZ : 위 코드에서 t2.foo, t2._bar, t2.__baz 값은?
dunder (double underscore)
네임 맹글링
_MangledGlobal__mangled = 23
class MangledGlobal:
def test(self):
return __mangled
‘var’
_
car = ('red', 'auto', 12, 3812)
color, _, _, mileage = car
템플릿문자열
from string import Template
name = 'kbae'
t = Template('Hey, $name!')
t.substitute(name=name)
'''
사용 이유 :
공격자가 형식 문지열에서 __globals__ 딕셔너리에 접근 가능함.
'''
SECRET = 'this is a secret'
class Error:
def __init__(self):
pass
err = Error()
user_input = '{error.__init__.__globals__[SECRET]}'
user_input.format(error=err)
'''
사용조건 :
형식 문자열이 사용자가 제공한 경우 템플릿 문자열을 사용하자!
'''