docs: def send_photo(self, chat_id, photo, caption=None, parse_mode=None, disable_notification=None, reply_to_message_id=None, reply_markup=None):
          """
          Use this method to send photos. On success, the sent Message is returned.
  
          https://core.telegram.org/bots/api#sendphoto
  
          
          Parameters:
          
          :param chat_id: Unique identifier for the target chat or username of the target channel (in the format @channelusername)
          :type  chat_id: int | str|unicode
          
          :param photo: Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. More info on Sending Files »
          :type  photo: pytgbot.api_types.sendable.files.InputFile | str|unicode
          
          
          Optional keyword parameters:
          
          :param caption: Photo caption (may also be used when resending photos by file_id), 0-1024 characters
          :type  caption: str|unicode
          
          :param parse_mode: Send Markdown or HTML, if you want Telegram apps to show bold, italic, fixed-width text or inline URLs in the media caption.
          :type  parse_mode: str|unicode
          
          :param disable_notification: Sends the message silently. Users will receive a notification with no sound.
          :type  disable_notification: bool
          
          :param reply_to_message_id: If the message is a reply, ID of the original message
          :type  reply_to_message_id: int
          
          :param reply_markup: Additional interface options. A JSON-serialized object for an inline keyboard, custom reply keyboard, instructions to remove reply keyboard or to force a reply from the user.
          :type  reply_markup: pytgbot.api_types.sendable.reply_markup.InlineKeyboardMarkup | pytgbot.api_types.sendable.reply_markup.ReplyKeyboardMarkup | pytgbot.api_types.sendable.reply_markup.ReplyKeyboardRemove | pytgbot.api_types.sendable.reply_markup.ForceReply
          
          Returns:
  
          :return: On success, the sent Message is returned
          :rtype:  pytgbot.api_types.receivable.updates.Message
          """
          from pytgbot.api_types.sendable.files import InputFile
          from pytgbot.api_types.sendable.reply_markup import ForceReply
          from pytgbot.api_types.sendable.reply_markup import InlineKeyboardMarkup
          from pytgbot.api_types.sendable.reply_markup import ReplyKeyboardMarkup
          from pytgbot.api_types.sendable.reply_markup import ReplyKeyboardRemove
          
          assert_type_or_raise(chat_id, (int, unicode_type), parameter_name="chat_id")
          
          assert_type_or_raise(photo, (InputFile, unicode_type), parameter_name="photo")
          
          assert_type_or_raise(caption, None, unicode_type, parameter_name="caption")
          
          assert_type_or_raise(parse_mode, None, unicode_type, parameter_name="parse_mode")
          
          assert_type_or_raise(disable_notification, None, bool, parameter_name="disable_notification")
          
          assert_type_or_raise(reply_to_message_id, None, int, parameter_name="reply_to_message_id")
          
          assert_type_or_raise(reply_markup, None, (InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply), parameter_name="reply_markup")
          
          result = self.do("sendPhoto", chat_id=chat_id, photo=photo, caption=caption, parse_mode=parse_mode, disable_notification=disable_notification, reply_to_message_id=reply_to_message_id, reply_markup=reply_markup)
          if self.return_python_objects:
              logger.debug("Trying to parse {data}".format(data=repr(result)))
              from pytgbot.api_types.receivable.updates import Message
              try:
                  return Message.from_array(result)
              except TgApiParseException:
                  logger.debug("Failed parsing as api_type Message", exc_info=True)
              # end try
              # no valid parsing so far
              raise TgApiParseException("Could not parse result.")  # See debug log for details!
          # end if return_python_objects
          return result