Message 클래스는 네트워크 또는 프로세스 공간에서 효율적인 전송을 위해 메시지를 정의하는 데 사용됩니다. 메시지는 필드 클래스를 사용하여 정의됩니다.
Message
는 protorpc.messages
모듈에서 제공됩니다.
소개
메시지는 필드 속성과 기타 Message 및 Enum 정의만 포함할 수 있다는 점에서 일반 클래스보다 더 제한적입니다. 이러한 제한이 있는 이유는 Message 클래스 자체의 구조가 네트워크 또는 프로세스 공간에서 전송되며 클라이언트 또는 심지어 다른 서버에 의해 직접 사용되기 때문입니다. 따라서 메소드 및 비필드 속성을 구조적 정보와 함께 전송할 수 없으며, 이로 인해 서로 다른 언어와 구현 간에 불일치 문제가 발생합니다.
초기화 및 유효성 검사
Message 객체는 모든 필수 필드를 포함하고 중첩 메시지도 모두 초기화된 경우 초기화된 것으로 간주됩니다.
초기화되지 않은 경우 'check_initialized'를 호출하면 ValidationError가 발생합니다. 'is_initialized'는 유효 여부를 나타내는 부울 값을 반환합니다.
Google 프로토콜 RPC는 Message 객체가 생성되고 채워질 때 자동으로 해당 객체의 유효성을 검사합니다. 애플리케이션은 Field 인스턴스의 validate() 메소드를 사용하여 지정된 값과 해당 값이 할당된 필드가 서로 호환되는지 여부를 확인할 수 있습니다. 이 메소드를 메시지에 사용하면 메시지 및 하위 메시지의 모든 값이 유효한지 확인합니다. 잘못된 값을 필드에 할당하면 ValidationError가 발생합니다.
다음 예에서는 가상의 주식 거래 애플리케이션에서 Message 객체를 만들고 초기화합니다.
from protorpc import messages # Trade type. class TradeType(messages.Enum): BUY = 1 SELL = 2 SHORT = 3 CALL = 4 class Lot(messages.Message): price = messages.IntegerField(1, required=True) quantity = messages.IntegerField(2, required=True) class Order(messages.Message): symbol = messages.StringField(1, required=True) total_quantity = messages.IntegerField(2, required=True) trade_type = messages.EnumField(TradeType, 3, required=True) lots = messages.MessageField(Lot, 4, repeated=True) limit = messages.IntegerField(5) order = Order(symbol='GOOG', total_quantity=10, trade_type=TradeType.BUY) lot1 = Lot(price=304, quantity=7) lot2 = Lot(price=305, quantity=3) order.lots = [lot1, lot2] # Now object is initialized! order.check_initialized()
생성자
Message 클래스의 생성자는 다음과 같이 정의됩니다.
- class Message(**kwargs)
-
내부 메시지 상태를 초기화합니다.
애플리케이션은 필드 클래스에 해당하는 키워드 인수를 전달하여 생성자를 통해 메시지를 초기화합니다. 예를 들면 다음과 같습니다.
class Date(Message) day = IntegerField(1) month = IntegerField(2) year = IntegerField(3)
클래스 필드를 정의한 후에는 필드 값을 간결하게 호출할 수 있습니다. 다음 두 호출은 동일합니다.
date = Date(day=6, month=6, year=1911)
위 호출은 다음 호출과 동일합니다.
date = Date() date.day = 6 date.month = 6 date.year = 1911
클래스 메서드
Message 클래스는 다음과 같은 클래스 메소드를 제공합니다.
- all_fields()
- 모든 필드 정의 객체를 가져옵니다. 모든 값에 대한 반복기를 임의의 순서로 반환합니다.
- field_by_name(name)
- 이름별로 필드를 가져옵니다. 이름에 연결된 Field 객체를 반환합니다.
- 해당 이름이 지정된 필드를 찾을 수 없으면 KeyError가 발생합니다.
- field_by_number(number)
- 번호별로 필드를 가져옵니다. 해당 번호에 연결된 Field 객체를 반환합니다.
- 해당 번호가 지정된 필드를 찾을 수 없으면 KeyError가 발생합니다.
인스턴스 메서드
Message 인스턴스에는 다음과 같은 메소드가 있습니다.
- check_initialized()
- 모든 필수 필드가 초기화되었는지 확인합니다.
- Message 객체가 초기화되지 않았으면 ValidationError가 발생합니다.
- get_assigned_value(name)
- 속성의 할당된 값을 가져옵니다. 값이 설정되지 않은 경우 None을 반환합니다.
- 인수:
- name
- 가져올 속성의 이름입니다.
속성의 할당된 값 또는 None(속성에 할당된 값이 없는 경우)을 반환합니다.
- is_initialized(name)
- Message 객체의 초기화 상태를 가져옵니다. 메시지가 유효하면
True
를 반환하고 그렇지 않으면False
를 반환합니다. - reset(name)
- 필드에 할당된 값을 재설정합니다(기본값이 재설정됨). 기본값이 없는 경우 None을 반환합니다.
- 인수:
- name
- 재설정할 필드의 이름입니다.