diff --git a/telegram/_botcommandscope.py b/telegram/_botcommandscope.py index 2cac2f50a5b..53e65610c0a 100644 --- a/telegram/_botcommandscope.py +++ b/telegram/_botcommandscope.py @@ -84,13 +84,19 @@ def __init__(self, type: str, *, api_kwargs: Optional[JSONDict] = None): self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["BotCommandScope"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["BotCommandScope"]: """Converts JSON data to the appropriate :class:`BotCommandScope` object, i.e. takes care of selecting the correct subclass. Args: data (Dict[:obj:`str`, ...]): The JSON data. - bot (:class:`telegram.Bot`): The bot associated with this object. + bot (:class:`telegram.Bot`, optional): The bot associated with this object. Defaults to + :obj:`None`, in which case shortcut methods will not be available. + + .. versionchanged:: NEXT.VERSION + :paramref:`bot` is now optional and defaults to :obj:`None` Returns: The Telegram object. diff --git a/telegram/_business.py b/telegram/_business.py index ab1fdb91b51..22c89e024b4 100644 --- a/telegram/_business.py +++ b/telegram/_business.py @@ -106,7 +106,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["BusinessConnection"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["BusinessConnection"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -175,7 +177,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["BusinessMessagesDeleted"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["BusinessMessagesDeleted"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -232,7 +236,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["BusinessIntro"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["BusinessIntro"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -284,7 +290,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["BusinessLocation"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["BusinessLocation"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -431,7 +439,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["BusinessOpeningHours"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["BusinessOpeningHours"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_callbackquery.py b/telegram/_callbackquery.py index af89c784b10..d1cdc236be2 100644 --- a/telegram/_callbackquery.py +++ b/telegram/_callbackquery.py @@ -148,7 +148,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["CallbackQuery"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["CallbackQuery"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_chatbackground.py b/telegram/_chatbackground.py index 66b58c92a25..f9c77619f4c 100644 --- a/telegram/_chatbackground.py +++ b/telegram/_chatbackground.py @@ -78,7 +78,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["BackgroundFill"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["BackgroundFill"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -267,7 +269,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["BackgroundType"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["BackgroundType"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -528,7 +532,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ChatBackground"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["ChatBackground"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_chatboost.py b/telegram/_chatboost.py index cb7010a3cd4..7b972eec6d8 100644 --- a/telegram/_chatboost.py +++ b/telegram/_chatboost.py @@ -110,7 +110,9 @@ def __init__(self, source: str, *, api_kwargs: Optional[JSONDict] = None): self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ChatBoostSource"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["ChatBoostSource"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -275,7 +277,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ChatBoost"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["ChatBoost"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -325,7 +329,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ChatBoostUpdated"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["ChatBoostUpdated"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -382,7 +388,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ChatBoostRemoved"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["ChatBoostRemoved"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -429,7 +437,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["UserChatBoosts"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["UserChatBoosts"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_chatfullinfo.py b/telegram/_chatfullinfo.py index 3458f6fa6b3..349f61318de 100644 --- a/telegram/_chatfullinfo.py +++ b/telegram/_chatfullinfo.py @@ -496,7 +496,9 @@ def __init__( self.business_opening_hours: Optional[BusinessOpeningHours] = business_opening_hours @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ChatFullInfo"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["ChatFullInfo"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_chatinvitelink.py b/telegram/_chatinvitelink.py index 18799d9028a..43e7e8ab62d 100644 --- a/telegram/_chatinvitelink.py +++ b/telegram/_chatinvitelink.py @@ -151,7 +151,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ChatInviteLink"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["ChatInviteLink"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_chatjoinrequest.py b/telegram/_chatjoinrequest.py index 4d6fdf88581..9c444d97b4d 100644 --- a/telegram/_chatjoinrequest.py +++ b/telegram/_chatjoinrequest.py @@ -129,7 +129,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ChatJoinRequest"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["ChatJoinRequest"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_chatlocation.py b/telegram/_chatlocation.py index 3a3c561fc07..04f9854a23a 100644 --- a/telegram/_chatlocation.py +++ b/telegram/_chatlocation.py @@ -68,7 +68,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ChatLocation"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["ChatLocation"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_chatmember.py b/telegram/_chatmember.py index b399af30e28..0cc06bf5804 100644 --- a/telegram/_chatmember.py +++ b/telegram/_chatmember.py @@ -104,7 +104,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ChatMember"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["ChatMember"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_chatmemberupdated.py b/telegram/_chatmemberupdated.py index c51b88b7b3b..1aacb218533 100644 --- a/telegram/_chatmemberupdated.py +++ b/telegram/_chatmemberupdated.py @@ -141,7 +141,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ChatMemberUpdated"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["ChatMemberUpdated"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_chatpermissions.py b/telegram/_chatpermissions.py index 1bda731072e..c4e9e94b7a9 100644 --- a/telegram/_chatpermissions.py +++ b/telegram/_chatpermissions.py @@ -231,7 +231,9 @@ def no_permissions(cls) -> "ChatPermissions": return cls(*(14 * (False,))) @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ChatPermissions"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["ChatPermissions"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_choseninlineresult.py b/telegram/_choseninlineresult.py index bef8fbb3164..76380e95839 100644 --- a/telegram/_choseninlineresult.py +++ b/telegram/_choseninlineresult.py @@ -92,7 +92,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ChosenInlineResult"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["ChosenInlineResult"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_files/_basethumbedmedium.py b/telegram/_files/_basethumbedmedium.py index 6212e38f69a..ba35ea2e53e 100644 --- a/telegram/_files/_basethumbedmedium.py +++ b/telegram/_files/_basethumbedmedium.py @@ -82,7 +82,7 @@ def __init__( @classmethod def de_json( - cls: Type[ThumbedMT_co], data: Optional[JSONDict], bot: "Bot" + cls: Type[ThumbedMT_co], data: Optional[JSONDict], bot: Optional["Bot"] = None ) -> Optional[ThumbedMT_co]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_files/sticker.py b/telegram/_files/sticker.py index b1194deeeea..3c3c1cd7e72 100644 --- a/telegram/_files/sticker.py +++ b/telegram/_files/sticker.py @@ -193,7 +193,7 @@ def __init__( """:const:`telegram.constants.StickerType.CUSTOM_EMOJI`""" @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["Sticker"]: + def de_json(cls, data: Optional[JSONDict], bot: Optional["Bot"] = None) -> Optional["Sticker"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -305,7 +305,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["StickerSet"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["StickerSet"]: """See :meth:`telegram.TelegramObject.de_json`.""" if not data: return None diff --git a/telegram/_files/venue.py b/telegram/_files/venue.py index caf60355533..443bd009c17 100644 --- a/telegram/_files/venue.py +++ b/telegram/_files/venue.py @@ -103,7 +103,7 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["Venue"]: + def de_json(cls, data: Optional[JSONDict], bot: Optional["Bot"] = None) -> Optional["Venue"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_games/game.py b/telegram/_games/game.py index 8eff71a0a61..93b3f0161cc 100644 --- a/telegram/_games/game.py +++ b/telegram/_games/game.py @@ -122,7 +122,7 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["Game"]: + def de_json(cls, data: Optional[JSONDict], bot: Optional["Bot"] = None) -> Optional["Game"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_games/gamehighscore.py b/telegram/_games/gamehighscore.py index 991255fe1d5..40f93fadd49 100644 --- a/telegram/_games/gamehighscore.py +++ b/telegram/_games/gamehighscore.py @@ -61,7 +61,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["GameHighScore"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["GameHighScore"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_giveaway.py b/telegram/_giveaway.py index ed6d4a28895..0008dc9dd4c 100644 --- a/telegram/_giveaway.py +++ b/telegram/_giveaway.py @@ -123,7 +123,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["Giveaway"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["Giveaway"]: """See :obj:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -257,7 +259,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["GiveawayWinners"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["GiveawayWinners"]: """See :obj:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -323,7 +327,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["GiveawayCompleted"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["GiveawayCompleted"]: """See :obj:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_inline/inlinekeyboardbutton.py b/telegram/_inline/inlinekeyboardbutton.py index d88f222cad7..1a3e1675664 100644 --- a/telegram/_inline/inlinekeyboardbutton.py +++ b/telegram/_inline/inlinekeyboardbutton.py @@ -284,7 +284,9 @@ def _set_id_attrs(self) -> None: ) @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["InlineKeyboardButton"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["InlineKeyboardButton"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_inline/inlinekeyboardmarkup.py b/telegram/_inline/inlinekeyboardmarkup.py index c806318246a..efb181e8aa5 100644 --- a/telegram/_inline/inlinekeyboardmarkup.py +++ b/telegram/_inline/inlinekeyboardmarkup.py @@ -90,7 +90,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["InlineKeyboardMarkup"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["InlineKeyboardMarkup"]: """See :meth:`telegram.TelegramObject.de_json`.""" if not data: return None diff --git a/telegram/_inline/inlinequery.py b/telegram/_inline/inlinequery.py index cc9044beb18..ba29a8646fe 100644 --- a/telegram/_inline/inlinequery.py +++ b/telegram/_inline/inlinequery.py @@ -125,7 +125,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["InlineQuery"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["InlineQuery"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_inline/inlinequeryresultsbutton.py b/telegram/_inline/inlinequeryresultsbutton.py index da850340cac..ae0b404e1f8 100644 --- a/telegram/_inline/inlinequeryresultsbutton.py +++ b/telegram/_inline/inlinequeryresultsbutton.py @@ -97,7 +97,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["InlineQueryResultsButton"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["InlineQueryResultsButton"]: """See :meth:`telegram.TelegramObject.de_json`.""" if not data: return None diff --git a/telegram/_inline/inputinvoicemessagecontent.py b/telegram/_inline/inputinvoicemessagecontent.py index 74ea97de297..be539bcb38c 100644 --- a/telegram/_inline/inputinvoicemessagecontent.py +++ b/telegram/_inline/inputinvoicemessagecontent.py @@ -255,7 +255,7 @@ def __init__( @classmethod def de_json( - cls, data: Optional[JSONDict], bot: "Bot" + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None ) -> Optional["InputInvoiceMessageContent"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_keyboardbutton.py b/telegram/_keyboardbutton.py index 0cb4cd82e65..ad08f2f98ad 100644 --- a/telegram/_keyboardbutton.py +++ b/telegram/_keyboardbutton.py @@ -168,7 +168,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["KeyboardButton"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["KeyboardButton"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_keyboardbuttonrequest.py b/telegram/_keyboardbuttonrequest.py index fa94433ebd9..07f2c3a99aa 100644 --- a/telegram/_keyboardbuttonrequest.py +++ b/telegram/_keyboardbuttonrequest.py @@ -264,7 +264,7 @@ def __init__( @classmethod def de_json( - cls, data: Optional[JSONDict], bot: "Bot" + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None ) -> Optional["KeyboardButtonRequestChat"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_menubutton.py b/telegram/_menubutton.py index 2044fb551fe..5856fc8d10e 100644 --- a/telegram/_menubutton.py +++ b/telegram/_menubutton.py @@ -69,13 +69,19 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["MenuButton"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["MenuButton"]: """Converts JSON data to the appropriate :class:`MenuButton` object, i.e. takes care of selecting the correct subclass. Args: data (Dict[:obj:`str`, ...]): The JSON data. - bot (:class:`telegram.Bot`): The bot associated with this object. + bot (:class:`telegram.Bot`, optional): The bot associated with this object. Defaults to + :obj:`None`, in which case shortcut methods will not be available. + + .. versionchanged:: NEXT.VERSION + :paramref:`bot` is now optional and defaults to :obj:`None` Returns: The Telegram object. @@ -161,7 +167,9 @@ def __init__(self, text: str, web_app: WebAppInfo, *, api_kwargs: Optional[JSOND self._id_attrs = (self.type, self.text, self.web_app) @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["MenuButtonWebApp"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["MenuButtonWebApp"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_message.py b/telegram/_message.py index b0605cd094d..0a8884794f5 100644 --- a/telegram/_message.py +++ b/telegram/_message.py @@ -178,7 +178,10 @@ def is_accessible(self) -> bool: @classmethod def _de_json( - cls, data: Optional[JSONDict], bot: "Bot", api_kwargs: Optional[JSONDict] = None + cls, + data: Optional[JSONDict], + bot: Optional["Bot"] = None, + api_kwargs: Optional[JSONDict] = None, ) -> Optional["MaybeInaccessibleMessage"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -1205,7 +1208,7 @@ def link(self) -> Optional[str]: return None @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["Message"]: + def de_json(cls, data: Optional[JSONDict], bot: Optional["Bot"] = None) -> Optional["Message"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_messageentity.py b/telegram/_messageentity.py index 2f7fb7d6179..bbea88d10ae 100644 --- a/telegram/_messageentity.py +++ b/telegram/_messageentity.py @@ -129,7 +129,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["MessageEntity"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["MessageEntity"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_messageorigin.py b/telegram/_messageorigin.py index 3577e6091f8..534583adb8b 100644 --- a/telegram/_messageorigin.py +++ b/telegram/_messageorigin.py @@ -94,7 +94,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["MessageOrigin"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["MessageOrigin"]: """Converts JSON data to the appropriate :class:`MessageOrigin` object, i.e. takes care of selecting the correct subclass. """ diff --git a/telegram/_messagereactionupdated.py b/telegram/_messagereactionupdated.py index 8366d1c083c..d4d4033a647 100644 --- a/telegram/_messagereactionupdated.py +++ b/telegram/_messagereactionupdated.py @@ -86,7 +86,7 @@ def __init__( @classmethod def de_json( - cls, data: Optional[JSONDict], bot: "Bot" + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None ) -> Optional["MessageReactionCountUpdated"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -186,7 +186,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["MessageReactionUpdated"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["MessageReactionUpdated"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_passport/credentials.py b/telegram/_passport/credentials.py index 525dd473e17..514f7fffb6c 100644 --- a/telegram/_passport/credentials.py +++ b/telegram/_passport/credentials.py @@ -232,7 +232,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["Credentials"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["Credentials"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -342,7 +344,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["SecureData"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["SecureData"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -448,7 +452,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["SecureValue"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["SecureValue"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_passport/encryptedpassportelement.py b/telegram/_passport/encryptedpassportelement.py index f0d869fe2e3..76eb8e51f54 100644 --- a/telegram/_passport/encryptedpassportelement.py +++ b/telegram/_passport/encryptedpassportelement.py @@ -193,7 +193,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["EncryptedPassportElement"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["EncryptedPassportElement"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -210,14 +212,21 @@ def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["EncryptedPas @classmethod def de_json_decrypted( - cls, data: Optional[JSONDict], bot: "Bot", credentials: "Credentials" + cls, data: Optional[JSONDict], bot: Optional["Bot"], credentials: "Credentials" ) -> Optional["EncryptedPassportElement"]: """Variant of :meth:`telegram.TelegramObject.de_json` that also takes into account passport credentials. Args: data (Dict[:obj:`str`, ...]): The JSON data. - bot (:class:`telegram.Bot`): The bot associated with this object. + bot (:class:`telegram.Bot` | :obj:`None`): The bot associated with these object. + May be :obj:`None`, in which case shortcut methods will not be available. + + .. versionchanged:: NEXT.VERSION + :paramref:`bot` is now optional and defaults to :obj:`None` + + .. deprecated:: NEXT.VERSION + This argument will be converted to an optional argument in future versions. credentials (:class:`telegram.FileCredentials`): The credentials Returns: diff --git a/telegram/_passport/passportdata.py b/telegram/_passport/passportdata.py index 0dae4ba68c8..32e3879bc4d 100644 --- a/telegram/_passport/passportdata.py +++ b/telegram/_passport/passportdata.py @@ -81,7 +81,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["PassportData"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["PassportData"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_passport/passportfile.py b/telegram/_passport/passportfile.py index 3c69e9eb570..3ae4a42e81f 100644 --- a/telegram/_passport/passportfile.py +++ b/telegram/_passport/passportfile.py @@ -118,14 +118,21 @@ def file_date(self) -> int: @classmethod def de_json_decrypted( - cls, data: Optional[JSONDict], bot: "Bot", credentials: "FileCredentials" + cls, data: Optional[JSONDict], bot: Optional["Bot"], credentials: "FileCredentials" ) -> Optional["PassportFile"]: """Variant of :meth:`telegram.TelegramObject.de_json` that also takes into account passport credentials. Args: data (Dict[:obj:`str`, ...]): The JSON data. - bot (:class:`telegram.Bot`): The bot associated with this object. + bot (:class:`telegram.Bot` | :obj:`None`): The bot associated with these object. + May be :obj:`None`, in which case shortcut methods will not be available. + + .. versionchanged:: NEXT.VERSION + :paramref:`bot` is now optional and defaults to :obj:`None` + + .. deprecated:: NEXT.VERSION + This argument will be converted to an optional argument in future versions. credentials (:class:`telegram.FileCredentials`): The credentials Returns: @@ -143,7 +150,10 @@ def de_json_decrypted( @classmethod def de_list_decrypted( - cls, data: Optional[List[JSONDict]], bot: "Bot", credentials: List["FileCredentials"] + cls, + data: Optional[List[JSONDict]], + bot: Optional["Bot"], + credentials: List["FileCredentials"], ) -> Tuple[Optional["PassportFile"], ...]: """Variant of :meth:`telegram.TelegramObject.de_list` that also takes into account passport credentials. @@ -155,7 +165,14 @@ def de_list_decrypted( Args: data (List[Dict[:obj:`str`, ...]]): The JSON data. - bot (:class:`telegram.Bot`): The bot associated with these objects. + bot (:class:`telegram.Bot` | :obj:`None`): The bot associated with these object. + May be :obj:`None`, in which case shortcut methods will not be available. + + .. versionchanged:: NEXT.VERSION + :paramref:`bot` is now optional and defaults to :obj:`None` + + .. deprecated:: NEXT.VERSION + This argument will be converted to an optional argument in future versions. credentials (:class:`telegram.FileCredentials`): The credentials Returns: diff --git a/telegram/_payment/orderinfo.py b/telegram/_payment/orderinfo.py index b3a41b54345..7d3ee84a37b 100644 --- a/telegram/_payment/orderinfo.py +++ b/telegram/_payment/orderinfo.py @@ -71,7 +71,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["OrderInfo"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["OrderInfo"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_payment/precheckoutquery.py b/telegram/_payment/precheckoutquery.py index fb57127fc11..1e7dca7bf33 100644 --- a/telegram/_payment/precheckoutquery.py +++ b/telegram/_payment/precheckoutquery.py @@ -110,7 +110,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["PreCheckoutQuery"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["PreCheckoutQuery"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_payment/shippingquery.py b/telegram/_payment/shippingquery.py index ab7e5a1b2f4..47a62192489 100644 --- a/telegram/_payment/shippingquery.py +++ b/telegram/_payment/shippingquery.py @@ -77,7 +77,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ShippingQuery"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["ShippingQuery"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_payment/successfulpayment.py b/telegram/_payment/successfulpayment.py index a7424feba22..5298f66801e 100644 --- a/telegram/_payment/successfulpayment.py +++ b/telegram/_payment/successfulpayment.py @@ -105,7 +105,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["SuccessfulPayment"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["SuccessfulPayment"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_poll.py b/telegram/_poll.py index cd6397cf733..01ec75ca5fa 100644 --- a/telegram/_poll.py +++ b/telegram/_poll.py @@ -90,7 +90,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["InputPollOption"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["InputPollOption"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -154,7 +156,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["PollOption"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["PollOption"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -301,7 +305,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["PollAnswer"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["PollAnswer"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -467,7 +473,7 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["Poll"]: + def de_json(cls, data: Optional[JSONDict], bot: Optional["Bot"] = None) -> Optional["Poll"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_proximityalerttriggered.py b/telegram/_proximityalerttriggered.py index dd05c1ddd95..0880ca9a6f6 100644 --- a/telegram/_proximityalerttriggered.py +++ b/telegram/_proximityalerttriggered.py @@ -67,7 +67,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ProximityAlertTriggered"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["ProximityAlertTriggered"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_reaction.py b/telegram/_reaction.py index 60bdbebc489..d1ba718f0d6 100644 --- a/telegram/_reaction.py +++ b/telegram/_reaction.py @@ -65,7 +65,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ReactionType"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["ReactionType"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -192,7 +194,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ReactionCount"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["ReactionCount"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_reply.py b/telegram/_reply.py index 973cee5ddfe..3ca342d067b 100644 --- a/telegram/_reply.py +++ b/telegram/_reply.py @@ -231,7 +231,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ExternalReplyInfo"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["ExternalReplyInfo"]: """See :obj:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -329,7 +331,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["TextQuote"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["TextQuote"]: """See :obj:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -434,7 +438,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ReplyParameters"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["ReplyParameters"]: """See :obj:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_shared.py b/telegram/_shared.py index 8c791154e2f..b4ce2c4d5a0 100644 --- a/telegram/_shared.py +++ b/telegram/_shared.py @@ -83,7 +83,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["UsersShared"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["UsersShared"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -172,7 +174,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ChatShared"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["ChatShared"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -250,7 +254,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["SharedUser"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["SharedUser"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_story.py b/telegram/_story.py index 4cb4a8454b6..40d17cdb16d 100644 --- a/telegram/_story.py +++ b/telegram/_story.py @@ -71,7 +71,7 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["Story"]: + def de_json(cls, data: Optional[JSONDict], bot: Optional["Bot"] = None) -> Optional["Story"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_telegramobject.py b/telegram/_telegramobject.py index 2f61dace88e..04275b9a928 100644 --- a/telegram/_telegramobject.py +++ b/telegram/_telegramobject.py @@ -403,7 +403,7 @@ def _parse_data(data: Optional[JSONDict]) -> Optional[JSONDict]: def _de_json( cls: Type[Tele_co], data: Optional[JSONDict], - bot: "Bot", + bot: Optional["Bot"], api_kwargs: Optional[JSONDict] = None, ) -> Optional[Tele_co]: if data is None: @@ -432,12 +432,18 @@ def _de_json( return obj @classmethod - def de_json(cls: Type[Tele_co], data: Optional[JSONDict], bot: "Bot") -> Optional[Tele_co]: + def de_json( + cls: Type[Tele_co], data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional[Tele_co]: """Converts JSON data to a Telegram object. Args: data (Dict[:obj:`str`, ...]): The JSON data. - bot (:class:`telegram.Bot`): The bot associated with this object. + bot (:class:`telegram.Bot`, optional): The bot associated with this object. Defaults to + :obj:`None`, in which case shortcut methods will not be available. + + .. versionchanged:: NEXT.VERSION + :paramref:`bot` is now optional and defaults to :obj:`None` Returns: The Telegram object. @@ -447,7 +453,7 @@ def de_json(cls: Type[Tele_co], data: Optional[JSONDict], bot: "Bot") -> Optiona @classmethod def de_list( - cls: Type[Tele_co], data: Optional[List[JSONDict]], bot: "Bot" + cls: Type[Tele_co], data: Optional[List[JSONDict]], bot: Optional["Bot"] = None ) -> Tuple[Tele_co, ...]: """Converts a list of JSON objects to a tuple of Telegram objects. @@ -458,7 +464,11 @@ def de_list( Args: data (List[Dict[:obj:`str`, ...]]): The JSON data. - bot (:class:`telegram.Bot`): The bot associated with these objects. + bot (:class:`telegram.Bot`, optional): The bot associated with these object. Defaults + to :obj:`None`, in which case shortcut methods will not be available. + + .. versionchanged:: NEXT.VERSION + :paramref:`bot` is now optional and defaults to :obj:`None` Returns: A tuple of Telegram objects. diff --git a/telegram/_update.py b/telegram/_update.py index 68ff52649d2..579cb008580 100644 --- a/telegram/_update.py +++ b/telegram/_update.py @@ -729,7 +729,7 @@ def effective_message(self) -> Optional[Message]: return message @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["Update"]: + def de_json(cls, data: Optional[JSONDict], bot: Optional["Bot"] = None) -> Optional["Update"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_userprofilephotos.py b/telegram/_userprofilephotos.py index 36e260da9f2..9a5e4a066ef 100644 --- a/telegram/_userprofilephotos.py +++ b/telegram/_userprofilephotos.py @@ -70,7 +70,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["UserProfilePhotos"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["UserProfilePhotos"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_utils/datetime.py b/telegram/_utils/datetime.py index 1c0da085434..40d931efffe 100644 --- a/telegram/_utils/datetime.py +++ b/telegram/_utils/datetime.py @@ -188,13 +188,16 @@ def from_timestamp( return dtm.datetime.fromtimestamp(unixtime, tz=UTC if tzinfo is None else tzinfo) -def extract_tzinfo_from_defaults(bot: "Bot") -> Union[dtm.tzinfo, None]: +def extract_tzinfo_from_defaults(bot: Optional["Bot"]) -> Union[dtm.tzinfo, None]: """ Extracts the timezone info from the default values of the bot. If the bot has no default values, :obj:`None` is returned. """ # We don't use `ininstance(bot, ExtBot)` here so that this works # without the job-queue extra dependencies as well + if bot is None: + return None + if hasattr(bot, "defaults") and bot.defaults: return bot.defaults.tzinfo return None diff --git a/telegram/_videochat.py b/telegram/_videochat.py index 3e5027c99fd..b392fa6d65b 100644 --- a/telegram/_videochat.py +++ b/telegram/_videochat.py @@ -125,7 +125,7 @@ def __init__( @classmethod def de_json( - cls, data: Optional[JSONDict], bot: "Bot" + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None ) -> Optional["VideoChatParticipantsInvited"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) @@ -177,7 +177,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["VideoChatScheduled"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["VideoChatScheduled"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/telegram/_webhookinfo.py b/telegram/_webhookinfo.py index c1b049b7109..a6f309a930d 100644 --- a/telegram/_webhookinfo.py +++ b/telegram/_webhookinfo.py @@ -162,7 +162,9 @@ def __init__( self._freeze() @classmethod - def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["WebhookInfo"]: + def de_json( + cls, data: Optional[JSONDict], bot: Optional["Bot"] = None + ) -> Optional["WebhookInfo"]: """See :meth:`telegram.TelegramObject.de_json`.""" data = cls._parse_data(data) diff --git a/tests/test_telegramobject.py b/tests/test_telegramobject.py index 39f3aaff4aa..ca893dec4d8 100644 --- a/tests/test_telegramobject.py +++ b/tests/test_telegramobject.py @@ -90,6 +90,11 @@ def test_de_json_api_kwargs(self, bot): assert to.api_kwargs == {"foo": "bar"} assert to.get_bot() is bot + def test_de_json_optional_bot(self): + to = TelegramObject.de_json(data={}) + with pytest.raises(RuntimeError, match="no bot associated with it"): + to.get_bot() + def test_de_list(self, bot): class SubClass(TelegramObject): def __init__(self, arg: int, **kwargs):