Post

Python 객체에서 데이터 타입으로 바꾸는 marshmallow 라이브러리 알아보기

Python 객체에서 데이터 타입으로 바꾸는 marshmallow 라이브러리 알아보기

오늘은 Python으로 객체를 파이썬 기본 데이터 타입으로 변환하는 marshmallow를 알아보려 합니다.

marshmallow 설치

우선 virtualenv로 파이썬 환경을 분리해줍니다.

1
pip3 install virtualenv
1
virtualenv -mvenv env

env라는 이름의 가상 환경을 생성합니다.

1
source env/bin/activate

가상환경을 폴더에서 활성화합니다.

1
pip3 install --upgrade pip

pip의 업그레이드가 존재하는지 확인하고 진행합니다.

1
pip install -U marshmallow

pip로 marshmallow를 설치합니다.

serializing

1
from marshmallow import Schema, fields, pprint

marshmallow에서 필요한 것들을 가져옵니다.

1
2
3
4
class User(object):
    def __init__(self, name, email):
        self.name = name
        self.email = email

User 모델 클래스를 만듭니다.

해당 모델은 이름과 이메일 필드를 가집니다.

1
2
3
class UserSchema(Schema):
    name = fields.Str()
    email = fields.Email()

위에서 만든 클래스의 속성 이름들에 Field 객체에 매핑되는 함수를 대입하여 스키마를 만듭니다.

1
2
user = User(name="name", email="name@example.org")
schema = UserSchema()

User 객체와 스키마 객체를 생성합니다.

1
2
result = schema.dump(user)
pprint(result.data)

스키마의 dump 메서드에 객체를 전달하여 serialize합니다

1
2
result = schema.dumps(user)
pprint(result.data)

JSON으로 인코딩 된 문자열로 serialize 할 수도 있습니다.

deserializing

1
from marshmallow import Schema, fields, post_load, pprint

marshmallow에서 필요한 것들을 가져옵니다.

1
2
3
4
class User(object):
    def __init__(self, name, email):
        self.name = name
        self.email = email

User 모델 클래스를 만듭니다.

해당 모델은 이름과 이메일 필드를 가집니다.

1
2
3
4
5
6
7
class UserSchema(Schema):
    name = fields.Str()
    email = fields.Email()

    @post_load
    def make_user(self, data):
        return User(**data)

위에서 만든 클래스의 속성 이름들에 Field 객체에 매핑되는 함수를 대입하여 스키마를 만듭니다.

또한 post_load로 데코레이팅하면 deserialize한 값이 반환되게 됩니다.

결국 user 객체가 반환됩니다.

1
2
3
4
user_data = {
    'email': u'name@exmple.com',
    'name': u'name'
}

이메일과 이름의 키 값을 가진 user_data 딕셔너리를 만듭니다.

1
2
3
schema = UserSchema()
result = schema.load(user_data)
pprint(result.data)

스키마의 load 메서드에 객체를 전달되지만 최종적으로 post_load가 데코레이팅되어 deserialize하게 됩니다.

vaildation

1
from marshmallow import fields, Schema, validates, ValidationError, pprint

marshmallow에서 필요한 것들을 가져옵니다.

1
2
3
class UserSchema(Schema):
    name = fields.Str(required=True)
    email = fields.Email()

위에서 만든 클래스의 속성 이름들에 Field 객체에 매핑되는 함수를 대입하여 스키마를 만듭니다.

단, 이번에는 name이라는 이름 필드가 반드시 들어가게 required 옵션을 True로 설정하였습니다.

1
2
data, errors = UserSchema().load({'email': 'foo'})
print(data, errors)

이름 필드를 작성하지 않은 채로 틀린 이메일 형식만 쓰면 errors에서 Missing data for required field.와 Not a valid email address.가 동시에 담겨 출력됩니다.

This post is licensed under CC BY 4.0 by the author.