본문 바로가기

Coding/Python113

Python 일급함수/클로저/Decorator에 관해서 파이썬에서의 일급함수, 데코레이터를 구현하는 방법은 알고 있었지만 그것이 무엇인지 명확하게 하나의 문장으로 설명할 수 있을까? 라는 질문을 나에게 던져본다면 잠시 망설일 것 같다. 평소에 이론적인 지식보다는 실무적으로 실제 구현 능력을 키우는 것에 좀 더 집중했기 때문인데 기본기를 다시 한번 다지자라는 마음으로 이렇게 포스팅으로나마 정리해본다. (최대한 간단한 예제를 통해 설명할 예정이다)첫 번째로 일급 함수에 대해 설명할 것이며 두 번째로 클로저에 대해서, 최종적으로 이 모든 특성을 결합하여 데코레이터를 만들어본다. 일급 함수(First citizen function)파이썬에서의 함수는 일급 함수이다. 일급 함수는 다음과 같은 조건에 만족해야한다. 1. 하나 또는 여러개의 함수를 인자로 받을 수 있다... 2019. 6. 4.
Python async/await로 비동기 프로그래밍하기 토이 프로젝트를 진행하면서 어떤 웹 프레임워크를 사용할까 고민을 많이 했었다. 기존에는 Django 또는 Flask로 대부분의 작업을 진행했는데, 요즘 파이썬 비동기 프로그래밍에 관심이 생겨서 관련 프레임워크를 찾아봤다. 많은 프레임워크가 있었고 그 중 aiohttp, sanic, vibora 총 3가지를 후보군으로 뒀다. 먼저 aiohttp는 주변에서 추천해주길래 한번 써봤는데 나쁘진 않았다. 하지만 sanic과 vibora보다 퍼포먼스가 좋지 않았다. 두번째로 vibora는 가장 속도가 빨랐다. 하지만 깃헙 스타가 5000개밖에 되지 않았다. 결과적으로 sanic을 사용하기로 결정했는데 그 이유는 다음과 같다. 첫번째로 형태가 Flask와 비슷했다. 나는 보통 프로젝트를 시작할 때 boilerplat.. 2019. 5. 23.
Django Custom Command 만드는 방법 보통 장고를 실행시키거나 테스트를 진행할 때 아래와 같은 명령어를 사용한다. python3 manage.py runserverpython3 manage.py test 이와 같이 manage.py를 통해 장고에 대한 작업을 진행하는 형태이다. 위처럼 하나의 파일을 통해 원하는 명령어를 실행시킬 수 있다면 관리하기도 용이할 것이다. 편리하게도 장고측에서 위처럼 이미 정의되어있는 명령어 이외에도 Custom하게 명령어를 만들 수 있도록 기능을 제공해준다. 먼저 아래의 명령어로 앱을 하나 생성한다. django-admin startapp testapp 그다음 앱 내부에 management라는 폴더를 생성한다. 그리고 해당 폴더 내부에 commands라는 폴더를 추가로 생성한다. commands폴더 내부에 실행시.. 2019. 5. 22.
Django QuerySet에 대하여 QuerySet is LazyDjango의 QuerySet은 Lazy하다. 한마디로 코드 상에서 쿼리를 구성해도 실제 데이터베이스에 접근하는 것은 평가(Evaluate)될 때 한번 뿐이다. 따라서 이러한 특성을 잘 이용한다면 데이터베이스에 접근하는 횟수를 줄일 수 있고 쿼리를 최적화하여 퍼포먼스를 증가시킬 수 있다. When QuerySets are evaluated내부적으로 QuerySet은 실제로 데이터베이스에 접근하지않고 필터링, 슬라이싱등의 작업을 할 수 있다. 한마디로 평가(Evaluate)되기 전까지 데이터베이스에 접근하지 않는다는 말이다. 아래와 같은 동작을 했을 때 QuerySet이 평가되고 실제 데이터베이스에 접근한다. - Iteration : QuerySet은 Iterable(순회 가능.. 2019. 4. 29.
MongoEngine ReferenceField without ObjectId 기존에 MongoEngine을 사용할 때 Embedded와 Reference방식에 대한 비교를 진행하는 글을 포스팅 했었다. (https://hides.tistory.com/1015) 현재 Reference 방식을 사용하여 도큐먼트를 모델링하던 중 ObjectId를 사용하지않고 원하는 필드를 사용하는 방법에 대해 궁금해졌고 그 방법에 대해 포스팅한다. 먼저 아래와 같이 User, Item 두개의 모델을 정의한다. from mongoengine import * connect('test') class User(Document): user_id = StringField() user_pw = StringField() class Item(Document): user_id = ReferenceField(User, .. 2019. 3. 26.
Python datetime으로 시간 더하고 빼는 방법 보통 파이썬으로 시간 관련 작업을 할 때 datetime 라이브러리를 사용한다. 이번 작업에서는 현재시간에서 특정 시간을 더하고 빼는 과정이 필요했는데 그 과정을 포스팅에 담아본다. from datetime import datetimenow = datetime.now().replace(microsecond=0) 위 라인을 차례대로 인터프리터에 입력해보면 아마 아래와 같은 값이 나올 것이다. (microsecond=0을 준 이유는 해당 옵션을 사용하지 않기 위함임. 제거해도 상관없다.) datetime.datetime(2019, 3, 25, 12, 38, 46) 위 결과를 통해 알 수 있듯이 now()를 사용하면 현재 시간을 datetime객체로 반환해준다. 또한 내부적으로 __str__ 매직메소드가 구현.. 2019. 3. 25.