Message 클래스

Message 클래스는 네트워크 또는 프로세스 공간에서 효율적인 전송을 위해 메시지를 정의하는 데 사용됩니다. 메시지는 필드 클래스를 사용하여 정의됩니다.

Messageprotorpc.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
재설정할 필드의 이름입니다.