2023-06-27 TIL

0v0baek·2023년 6월 27일
1

TIL

목록 보기
84/92

[Python] getattr

🚫 문제 발생

    async def receive(self, text_data):
        text_data_json = json.loads(text_data)
        my_type = text_data_json.get("type")
        if not my_type:
            user = text_data_json["roomData"]["host"]
            message = text_data_json["message"]

            # 그룹에게 같은 메세지 전달
            await self.channel_layer.group_send(
                self.room_group_name,
                {"type": "chat_message", "message": f"{user}: {message}"},
            )
        else:
            await self.my_type()

프론트에서 receive로 받아오는 메세지중에서,
type이 존재할 때 그 typevalue값과 이름이 일치하는 함수로 요청을 보내버리려는 게 목적이었다.

근데 이렇게 하면 안돼서 찾아보니까 getattr이라는 python 내장 함수가 있었다.

🔎 getattr : 객체의 속성을 동적으로 가져와줌

getattr(object, name[, default])

형식은 위와 같다.
맨 첫번째에 가져올 객체, 그 다음에 이름을 담는다
그리고 default 값을 설정해줄 수 있는데, 이는 객체 값이 없을 때 예외 처리를 하기에 유용하다.

✅ 코드에 적용

receive

            async_to_sync(channel_layer.group_send)(
                f"room_{room_id}",
                {"type": "start_game"},
            )

이런식으로 메세지가 가고 있다고 가정하면,

    async def receive(self, text_data):
		...
        else:
             await getattr(self, message)()

이런식으로 호출해버리는 거다!

[channels] group_send와 send의 차이

profile
개발 공부 하는 비전공자 새내기. 꾸준히 합시다!

0개의 댓글