Python/python - pythonic
python - default 인자 와 doc string 을 사용한 동적인 에러처리
python - default 인자 와 doc string 을 사용한 동적인 에러처리
2021.08.22디폴트 인자 값으로 None을 사용하는 것은 인자가 가변적인 경우 특히 중요하다. JSON 데이터로 인코딩된 값을 읽으려고하는데 데이터 디코딩에 실패하면 기본값으로 빈 dict 를 반환하고싶다고 가정해보자. import json def decode(data, default={}): try: return json.loads(data) except ValueError: return default 이 코드는 몇가지 문제가 있다. default 값이 모듈을 로드하는 시점에 단 한번만 평가되기 때문에 default에 지정된 dict 가 decode 함수 호출에 모두 공유된다. 이로인해 매우 놀라운 결과가 나타난다.. foo = decode('error data') foo['A'] = 10 bar = decode(..
Decorator
Decorator
2020.12.07데코레이터 (Decorator) 함수 앞뒤에 기능을 추가해서 손쉽게 함수를 활용할 수 있는 기법 혹시 다음과 같이 @가 사용된 파이썬 코드를 본 적이 있으신지? @decorator_func def function(): print("what is decorator?") 위 코드에서 @decorator_func 부분이 데코레이터임 def logger_login(): print("Dave login") logger_login() 시간을 앞뒤로 추가하고 싶다. 이렇게 넣으면 됩니다. import datetime def logger_login(): print(datetime.datetime.now()) print("Dave login") print(datetime.datetime.now()) logger_logi..
데코레이터를 이해하기전 알아야 할것들
데코레이터를 이해하기전 알아야 할것들
2020.12.06first_class 함수 다음과 같이 다룰 수 있는 함수를 first_class 함수라고 부름 함수 자체를 변수에 저장가능 함수의 인자에 다른 함수를 인수로 전달 가능 함수의 반환 값(return 값)으로 함수를 전달 가능 파이썬과 First_class 함수 사실 파이썬에서는 모든 것이 객체! 파이썬 함수도 객체로 되어 있어서, 기본 함수 기능 이외 객체 와 같은 활용이 가능 즉 파이썬의 함수들은 First-class 함수로 사용가능 언어별 일급함수 지원여부 python, Go, javascript, Kotlin 은 일급함수 지원 c언어 등은 미지원 def calc_square(digit): return digit * digit print(calc_square(2)) def list_square(fun..
벡터 클래스의 부활
벡터 클래스의 부활
2020.12.04from array import array import math class Vector2d: typecode = 'd' def __init__(self, x, y): self.x = float(x) self.y = float(y) def __iter__(self): return (i for i in (self.x, self.y)) def __repr__(self): class_name = type(self).__name__ return '{}({!r}, {!r})'.format(class_name, *self) def __str__(self): return str(tuple(self)) def __bytes__(self): return (bytes([ord(self.typecode)]) + bytes(a..
WeakValueDictionary 촌극
WeakValueDictionary 촌극
2020.12.04WeakValueDictionary 클래스는 객체애 대한 약한 참조를 값으로 가지는 가변 매핑을 구현한다. 참조된 객체가 프로그램 다른 곳에서 가비지 컬렉트되면 해당키도 WeakValueDictonary 에서 자동 제거된다. 이 클래스는 일반적으로 캐시를 구현하기 위해 사용된다. class Cheese: def __init__(self, kind): self.kind = kind def __repr__(self): return 'Cheese(%r)' % self.kind import weakref stock = weakref.WeakValueDictionary() catalog = [Cheese('Red Leicester'), Cheese('Tilsit'), Cheese('Brie'), Cheese('P..
약한참조
약한참조
2020.12.02객체가 메모리에 유지되거나 유지되지 않도록 만드는것은 참조의 존재여부다. 객체 참조 카운트가 0이면 가비지 컬렉터는 해당 객체를 제거한다. 그러나 불필요하게 객체를 유지시키지 않으면서 객체를 참조할 수 있으면 도움이 되는 경우가 종종 있다. 캐시가 대표적인 경우다. 약한 참조는 참조 카운트를 증가시키지 않고 객체를 참조한다. 참조의 대상인 객체를 참조 대상 (referent) 이라고 한다. 따라서 약한 참조는 참조 대상이 가비지 컬렉트 되는것을 방지하지 않는다고 말할 수 있다. 약한 참조는 캐시 어플리케이션에서 유용하게 사용된다. 캐시가 참조하고 있다고 해서 캐시된 객체가 계속 남아 있기 원치 않기 때문이다. import weakref a_set = {0, 1} wref = weakref.ref(a_se..
del 과 가비지 컬렉션
del 과 가비지 컬렉션
2020.12.02cpython 의 경우 가비지 컬렉션은 주로 참조 카운트(reference count)에 기반한다. refcount 가 0이 되자마자 cpython이 객체의 __del__() 메세드를 호출하고 객체에 할당되어 있는 메모리를 해제함으로써 객체가 제거된다. 파이썬 구현에서는 참조 카운트에 기반하지 않는 더 정교한 가비지 컬렉터를 사용하므로, 객체에 대한 참조가 모두 사라진 경우에도 __del__() 메서드가 바로 호출되지 않을 수도 있다. import weakref s1 = {1, 2, 3} s2 = s1 def bye(): print("Gone with the wind...") ender = weakref.finalize(s1, bye) print(ender.alive) del s1 print(ender...
간단한 데커레이터 구현하기
간단한 데커레이터 구현하기
2020.11.28import time def clock(func): def clocked(*args): # 내부 함수 clocked() 가 임의 개수의 위치 인수를 받을 수 있도록 정의한다. t0 = time.perf_counter() result = func(*args) # clocked() 에 대한 클로저에 자유 변수 func가 들어가야 이 코드가 작동한다. elapsed = time.perf_counter() name = func.__name__ arg_str = ', '.join(repr(arg) for arg in args) print('[%0.8fs] %s(%s) -> %r' % (elapsed, name, arg_str, result)) return result return clocked 이함수는 데커레이트..
nonlocal 선언 이 필요한 이유
nonlocal 선언 이 필요한 이유
2020.11.28def make_averager(): series = [] def average(new_value): series.append(new_value) total = sum(series) return total/len(series) return average make_averager() 는 그리 효율적이지 않다. 우리는 모든 값을 series 에 저장하고 average() 가 호출될 때마다 sum을 다시 계산했다. 합계와 항목 수를 저장 한 후 이 두개의 숫자를 이용해서 평균을 구하면 훨씬더 효율적으로 구현할 수 있다. def make_averager2(): count = 0 total = 0 def averager(new_value): count += 1 total += new_value return tot..
클로저 함수
클로저 함수
2020.11.28블로그 글을 보다 보면 클로저를 익명 함수와 혼동하는 경우가 종종 있다. 아마도 익명 함수를 이요하면서 함수 안에 함수를 정의하는 방식이 보편화 되었기 때문으로 생각된다. 그리고 클로저는 내포된 함수 안에서만 의미가 있다. 따라서 클로저와 익명 함수를 동일한 개념으로 생각하는 사람이 많은 것 같다. class Averager: def __init__(self): self.series = [] def __call__(self, new_value): self.series.append(new_value) total = sum(self.series) return total/len(self.series) avg = Averager() print(avg(10)) print(avg(11)) 10.0과 10.5가 출력..
변수 범위 규칙
변수 범위 규칙
2020.11.27b = 6 def f1(a): print(a) print(b) b = 9 f1(3) 이 문법은 발생시키는데 전역 변수 b가 있고 print(b) 다음에 지역 변수 b에 할당하는 문이 나오므로 전역 변수의 값이 6이 출력될 것이라고 생각 했지만 아니다. 사실은 파이썬이 함수 본체를 컴파일 할때 b가 함수 안에서 할당되므로 b를 지역 변수로 판단한다. 생성된 바이트코드를 보면 이 판단에 의해 지역 환경에서 b를 가져오려 한다는 것을 알수 있다. 나중에 f1(3)을 호출할 때 지역변수 a의 값을 출력하지만 지역 변수 b의 값을 가져오려 할때 b가 바인딩 되어 있지 않다는 것을 발견한다. 이 현상은 버그가 아니고 설계 결정사항이다. 파이썬은 변수가 선언되어 있기를 요구하지 않지만, 함수 본체 안에서 할당된 변수..
데커레이터 함수 이해하기
데커레이터 함수 이해하기
2020.11.27""" 함수 데커레이터는 소스 코드에 있는 함수를 '표시'해서 함수의 작동을 개선할 수 있게 해준다. 강력한 기능이지만, 데커레이터를 자유자재로 사용하려면 먼저 클로저를 알아야한다. 파이썬 3.0에 추가된 nonlocal은 최근에 추가된 예약 키워드 중 하나다. """ """ 데커레이터는 다른 함수를 인수로 받는 콜러블(데커레이트된 함수)이다. 데커레이터는 데커레이트된 함수에 어떤 처리를 수행하고, 함수를 반환하거나 함수를 다른 함수나 콜러블 객체로 대체한다. """ """ 데커레이터의 핵심 특징은 데커레이트된 함수가 정의된 직후에 실행된다는 것이다. 이는 일반적으로 파이썬이 모듈을 로딩하는 시점, 즉 임포트 타임에 실행된다. """ def deco(func): def inner(): print("run..