<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 async def answer_shipping_query(self, shipping_query_id: base.String, ok: base.Boolean, shipping_options: typing.Union[typing.List[types.ShippingOption], None] = None, error_message: typing.Union[base.String, None] = None) -> base.Boolean: """ If you sent an invoice requesting a shipping address and the parameter is_flexible was specified, the Bot API will send an Update with a shipping_query field to the bot. Source: https://core.telegram.org/bots/api#answershippingquery :param shipping_query_id: Unique identifier for the query to be answered :type shipping_query_id: :obj:`base.String` :param ok: Specify True if delivery to the specified address is possible and False if there are any problems (for example, if delivery to the specified address is not possible) :type ok: :obj:`base.Boolean` :param shipping_options: Required if ok is True. A JSON-serialized array of available shipping options :type shipping_options: :obj:`typing.Union[typing.List[types.ShippingOption], None]` :param error_message: Required if ok is False Error message in human readable form that explains why it is impossible to complete the order (e.g. "Sorry, delivery to your desired address is unavailable'). Telegram will display this message to the user. :type error_message: :obj:`typing.Union[base.String, None]` :return: On success, True is returned :rtype: :obj:`base.Boolean` """

        if shipping_options:
            shipping_options = prepare_arg([shipping_option.to_python()
                                            if hasattr(shipping_option, 'to_python')
                                            else shipping_option
                                            for shipping_option in shipping_options])
        payload = generate_payload(**locals())

        result = await self.request(api.Methods.ANSWER_SHIPPING_QUERY, payload)
        return result