본문 바로가기

반응형

프로그래밍언어/Python

(33)
[Python] Default Argument Value - mutable object 파이썬 함수를 호출하다가 이상한 점을 발견하였다. 분명히 인자로 아무 값도 넘겨주지 않았는데 함수 내부에서는 파라미터에 값이 들어가 있는 것이다. 디버깅을 한 결과 파이썬의 default argument value 를 잘못 사용하고 있었다는 것을 알게 되었다. 이 문서에서는 문제를 발견하고 이를 디버깅한 과정과 이후 알게 된 내용을 정리한다. 1. 이슈 발견 및 디버깅 예시에서는 Context 클래스의 func 함수를 호출하고 있다. func 함수는 v 라는 파라미터와 l 이라는 파라미터를 가지고 있다. 여기서 v 는 int 1 을 기본값으로 l 는 list [] 를 기본값으로 가지고 있다. func 함수는 리스트 l 에다가 v 의 값을 추가한 다음에 이를 화면에 출력하는 함수이다. 그렇기 때문에 함수를..
[Python] GIL (Global Interpreter Lock) 파이썬에서 멀티쓰레딩과 같이 동시성, 병렬 작업 등에 대한 공부를 하다보면 항상 나오는 단어가 있다. 바로 GIL 이다. GIL 은 Global Interpreter Lock 의 줄임말로 파이썬 인터프리터의 동작과 관련된 용어이다. GIL 이 무엇인지 대략적으로는 알고있지만 자세하게, 그래서 실제 멀티 쓰레딩, 멀티 코어에서 어떻게 동작하는지는 알지 못해서 이번 기회에 좀 더 알아보려 한다. 1. GIL GIL 은 일종의 mutex 이다. 인터프리터에서 thread-safe 하지 않은 객체들에 대한 접근을 막기위해 사용하는 쓰레드 mutex 이다. 인터프리터에서 한 번에 하나의 쓰레드만 실행하도록 하여 쓰레드들 간의 동작에 동기화를 맞추도록 하는 동작 원리이다. 파이썬의 경우 CPython 인터프리터가 ..
[Python] Awaitable awaitable 은 파이썬에서 await 키워드를 사용할 수 있는 객체들을 의미한다. 이들은 await 를 통해서 실행이 완료되기 전에 다른 작업으로 전환이 가능하다. awaitable 한 객체들은 Coroutines, Tasks, Futures 의 세종류가 있다. 1. Coroutines 파이썬 코루틴은 asyncio 라이브러리 내에 정의된 비동기 코루틴으로 async def 키워드를 사용하여 정의된 함수가 리턴하는 객체이다. 일반적으로 coroutine 이라는 용어는 async def 함수와 해당 함수가 반환하는 객체를 지칭하는 의미로 혼용된다. import asyncio async def nested(): return 42 async def main(): nested() # 아무 일도 일어나지 않..
[Python] Decorator 1. Decorator 란? 데코레이터란 또 다른 함수를 반환하는 함수를 의미한다. @wrapper 문법으로 다른 함수를 감싸는 방법으로 적용된다. 감싸진 함수는 wrapper 함수에 인자로 전달되고, wrapper 함수 내부에서 실행된다. 주로 함수의 내용을 직접 변경하지 않고 특정 행동이나 동작을 추가하기 위해서 사용하며, 많이 사용하는 데코레이터로는 classmethod() 와 staticmethod() 가 있다. 데코레이터는 다음과 같이 사용할 수 있으며, 예시의 두가지 표현은 동일하게 동작한다. # 함수 호출로 적용 def func(arg): statement(s) func = wrapper(func) # 데코레이터 표현식 적용 @wrapper def func(arg): statement(s) ..
[Python] module, package, library 1. module 코드를 잘 구성하기 위해서는 서로 연관이 있는 코드들을 모아서 그룹화해야한다. 모듈은 일반적으로 하나의 .py 파일에 저장된 연관된 코드 더미를 말한다. 모듈에는 함수, 클래스, 변수 또는 실행 가능한 코드 등을 선택하여 정의할 수 있다. 이렇게 저장된 모듈들을 애플리케이션에서 사용하기 위해서는 import 구문을 사용하여 해당 모듈을 가져와야 합니다. 모듈을 import 한 후에 모듈안에 있는 context 들을 module.context, module.function() 등의 문법으로 사용할 수 있다. 모듈에 있는 특정 요소만 사용하고 싶은 경우에는 from module import item 과 같은 형식으로 사용하여 모듈 전체가 아니라 해당 요소만 import 할 수 있다. # h..
[Python] copy 1. copy 파이썬에서 대입문을 통해 객체를 입력하는 경우에는 객체를 복사하는 것이 아니라 객체의 주소를 참조하도록 바인딩해준다. 만약 복사하려는 객체가 가변객체인 경우에는 복사를 통해서 복사본은 수정하고 원본은 유지하도록 하는 방식이 필요한 경우가 있다. copy 모듈은 기본적인 얕은 복사와 깊은 복사 연산을 제공해준다. 2. interfaces - copy.copy(x): 객체 x의 얕은 복사를 반환한다. - copy.deepcopy(x[. memo]): 객체 x의 깊은 복사를 반환한다. 얕은 복사와 깊은 복사의 차이는 리스트나 클래스 인스턴스와 같이 객체 내부에 또다른 객체를 포함하고 있는 경우에 나타난다. 얕은 복사는 새로운 객체를 생성하여 내부에 원본의 객체들과 연결된 참조를 저장하여 반환한다..
[Python] Magic method - 속성 관리 1. object.__getattr__(self, name) 객체의 attribute 에 접근이 실패하여 AttributeError 가 발생하면 호출된다. AttributeError 는 해당 attribute가 객체나 클래스에 존재하지 않는 경우 __getattribute__() 메서드 등에 의해 발생한다. 이때 예외처리를 통해서 특정한 속성 값을 반환할 수도 있고, 따로 처리가 없는 경우 동일하게 AttributeError를 반환하도록 할 수도 있다. 만약 정상적으로 attribute 가 반환되는 경우에는 __getattr__() 메서드가 호출되지 않는다. 만약 attribute 접근에 대한 완전한 조작을 하기 위해서는 아래의 __getattribute__() 메서드를 사용하면 된다. 2. object..
[Python] Magic method - 객체 표현 1. object.__repr__(self) 자바의 toString() 메서드와 같이 객체의 공식적인 문자열 표현을 수행하는 built-in 함수이다. 해당 객체를 인간이 이해할 수 있는 형태로 표현해주는 메서드로 repr의 결과를 통해서 같은 값을 가지는 새로운 객체를 만들 수 있는 python 표현이나, 해당 객체에 대한 설명 등을 얻을 수 있다. 보다 개발자 친화적인 결과를 반환하는데 사용된다. 만약 __str__() 이 정의되어 있지 않은 경우에 __repr__() 이 객체의 정보에 대한 표현에도 사용된다. 주로 디버깅에 사용된다. 2. object.__str__(self) str(object)나 format(), print() 등의 함수를 호출 시에 사용되는 객체의 표현법이다. 반환 타입은 st..

반응형