Improve typing hints (#537)

* Change type1 or type2 to Union[type1, type2]

* Address @KunoiSayami suggestions

* Change Union[type1, None] to Optional[type1]

* Update PR with latest commit changes

* Address Dan suggestions
This commit is contained in:
Alisson Lauffer 2020-12-20 13:05:17 -03:00 committed by GitHub
parent e1dac6c0e2
commit 1dc4df8cb1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
47 changed files with 121 additions and 110 deletions

View File

@ -29,7 +29,7 @@ from configparser import ConfigParser
from hashlib import sha256 from hashlib import sha256
from importlib import import_module from importlib import import_module
from pathlib import Path from pathlib import Path
from typing import Union, List from typing import Union, List, Optional
import pyrogram import pyrogram
from pyrogram import raw from pyrogram import raw
@ -396,7 +396,7 @@ class Client(Methods, Scaffold):
return self._parse_mode return self._parse_mode
@parse_mode.setter @parse_mode.setter
def parse_mode(self, parse_mode: Union[str, None] = "combined"): def parse_mode(self, parse_mode: Optional[str] = "combined"):
if parse_mode not in self.PARSE_MODES: if parse_mode not in self.PARSE_MODES:
raise ValueError('parse_mode must be one of {} or None. Not "{}"'.format( raise ValueError('parse_mode must be one of {} or None. Not "{}"'.format(
", ".join(f'"{m}"' for m in self.PARSE_MODES[:-1]), ", ".join(f'"{m}"' for m in self.PARSE_MODES[:-1]),
@ -406,7 +406,7 @@ class Client(Methods, Scaffold):
self._parse_mode = parse_mode self._parse_mode = parse_mode
# TODO: redundant, remove in next major version # TODO: redundant, remove in next major version
def set_parse_mode(self, parse_mode: Union[str, None] = "combined"): def set_parse_mode(self, parse_mode: Optional[str] = "combined"):
"""Set the parse mode to be used globally by the client. """Set the parse mode to be used globally by the client.
When setting the parse mode with this method, all other methods having a *parse_mode* parameter will follow the When setting the parse mode with this method, all other methods having a *parse_mode* parameter will follow the

View File

@ -19,6 +19,8 @@
import asyncio import asyncio
import logging import logging
from typing import Optional
from .transport import * from .transport import *
from ..session.internals import DataCenter from ..session.internals import DataCenter
@ -79,5 +81,5 @@ class Connection:
except Exception: except Exception:
raise OSError raise OSError
async def recv(self) -> bytes or None: async def recv(self) -> Optional[bytes]:
return await self.protocol.recv() return await self.protocol.recv()

View File

@ -18,6 +18,8 @@
import logging import logging
from typing import Optional
from .tcp import TCP from .tcp import TCP
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -41,7 +43,7 @@ class TCPAbridged(TCP):
+ data + data
) )
async def recv(self, length: int = 0) -> bytes or None: async def recv(self, length: int = 0) -> Optional[bytes]:
length = await super().recv(1) length = await super().recv(1)
if length is None: if length is None:

View File

@ -19,7 +19,10 @@
import logging import logging
import os import os
from typing import Optional
from pyrogram import utils from pyrogram import utils
from pyrogram.crypto import aes from pyrogram.crypto import aes
from .tcp import TCP from .tcp import TCP
@ -61,7 +64,7 @@ class TCPAbridgedO(TCP):
await super().send(payload) await super().send(payload)
async def recv(self, length: int = 0) -> bytes or None: async def recv(self, length: int = 0) -> Optional[bytes]:
length = await super().recv(1) length = await super().recv(1)
if length is None: if length is None:

View File

@ -17,6 +17,7 @@
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
import logging import logging
from typing import Optional
from binascii import crc32 from binascii import crc32
from struct import pack, unpack from struct import pack, unpack
@ -42,7 +43,7 @@ class TCPFull(TCP):
await super().send(data) await super().send(data)
async def recv(self, length: int = 0) -> bytes or None: async def recv(self, length: int = 0) -> Optional[bytes]:
length = await super().recv(4) length = await super().recv(4)
if length is None: if length is None:

View File

@ -17,6 +17,7 @@
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
import logging import logging
from typing import Optional
from struct import pack, unpack from struct import pack, unpack
from .tcp import TCP from .tcp import TCP
@ -35,7 +36,7 @@ class TCPIntermediate(TCP):
async def send(self, data: bytes, *args): async def send(self, data: bytes, *args):
await super().send(pack("<i", len(data)) + data) await super().send(pack("<i", len(data)) + data)
async def recv(self, length: int = 0) -> bytes or None: async def recv(self, length: int = 0) -> Optional[bytes]:
length = await super().recv(4) length = await super().recv(4)
if length is None: if length is None:

View File

@ -18,6 +18,7 @@
import logging import logging
import os import os
from typing import Optional
from struct import pack, unpack from struct import pack, unpack
from pyrogram.crypto import aes from pyrogram.crypto import aes
@ -62,7 +63,7 @@ class TCPIntermediateO(TCP):
) )
) )
async def recv(self, length: int = 0) -> bytes or None: async def recv(self, length: int = 0) -> Optional[bytes]:
length = await super().recv(4) length = await super().recv(4)
if length is None: if length is None:

View File

@ -19,7 +19,7 @@
import re import re
from datetime import datetime from datetime import datetime
from importlib import import_module from importlib import import_module
from typing import Type from typing import Type, Union
from pyrogram import raw from pyrogram import raw
from pyrogram.raw.core import TLObject from pyrogram.raw.core import TLObject
@ -32,7 +32,7 @@ class RPCError(Exception):
NAME = None NAME = None
MESSAGE = "{x}" MESSAGE = "{x}"
def __init__(self, x: int or raw.types.RpcError = None, rpc_name: str = None, is_unknown: bool = False): def __init__(self, x: Union[int, raw.types.RpcError] = None, rpc_name: str = None, is_unknown: bool = False):
super().__init__("[{} {}]: {} {}".format( super().__init__("[{} {}]: {} {}".format(
self.CODE, self.CODE,
self.ID or self.NAME, self.ID or self.NAME,

View File

@ -699,7 +699,7 @@ linked_channel = create(linked_channel_filter)
# endregion # endregion
def command(commands: str or List[str], prefixes: str or List[str] = "/", case_sensitive: bool = False): def command(commands: Union[str, List[str]], prefixes: Union[str, List[str]] = "/", case_sensitive: bool = False):
"""Filter commands, i.e.: text messages starting with "/" or any other custom prefix. """Filter commands, i.e.: text messages starting with "/" or any other custom prefix.
Parameters: Parameters:
@ -824,7 +824,7 @@ class user(Filter, set):
Defaults to None (no users). Defaults to None (no users).
""" """
def __init__(self, users: int or str or list = None): def __init__(self, users: Union[int, str, List[Union[int, str]]] = None):
users = [] if users is None else users if isinstance(users, list) else [users] users = [] if users is None else users if isinstance(users, list) else [users]
super().__init__( super().__init__(
@ -856,7 +856,7 @@ class chat(Filter, set):
Defaults to None (no chats). Defaults to None (no chats).
""" """
def __init__(self, chats: int or str or list = None): def __init__(self, chats: Union[int, str, List[Union[int, str]]] = None):
chats = [] if chats is None else chats if isinstance(chats, list) else [chats] chats = [] if chats is None else chats if isinstance(chats, list) else [chats]
super().__init__( super().__init__(

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union from typing import Union, Optional
from pyrogram import raw from pyrogram import raw
from pyrogram.scaffold import Scaffold from pyrogram.scaffold import Scaffold
@ -26,7 +26,7 @@ class SetSlowMode(Scaffold):
async def set_slow_mode( async def set_slow_mode(
self, self,
chat_id: Union[int, str], chat_id: Union[int, str],
seconds: Union[int, None] seconds: Optional[int]
) -> bool: ) -> bool:
"""Set the slow mode interval for a chat. """Set the slow mode interval for a chat.

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union from typing import Union, Optional
from pyrogram import raw from pyrogram import raw
from pyrogram.scaffold import Scaffold from pyrogram.scaffold import Scaffold
@ -26,7 +26,7 @@ class UpdateChatUsername(Scaffold):
async def update_chat_username( async def update_chat_username(
self, self,
chat_id: Union[int, str], chat_id: Union[int, str],
username: Union[str, None] username: Optional[str]
) -> bool: ) -> bool:
"""Update a channel or a supergroup username. """Update a channel or a supergroup username.

View File

@ -17,7 +17,7 @@
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
import logging import logging
from typing import Union, List from typing import Union, List, Optional
from pyrogram import types from pyrogram import types
from pyrogram.scaffold import Scaffold from pyrogram.scaffold import Scaffold
@ -32,7 +32,7 @@ class CopyMessage(Scaffold):
from_chat_id: Union[int, str], from_chat_id: Union[int, str],
message_id: int, message_id: int,
caption: str = None, caption: str = None,
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List["types.MessageEntity"] = None, caption_entities: List["types.MessageEntity"] = None,
disable_notification: bool = None, disable_notification: bool = None,
reply_to_message_id: int = None, reply_to_message_id: int = None,

View File

@ -20,7 +20,7 @@ import asyncio
import os import os
import time import time
from datetime import datetime from datetime import datetime
from typing import Union from typing import Union, Optional
from pyrogram import types from pyrogram import types
from pyrogram.file_id import FileId, FileType, PHOTO_TYPES from pyrogram.file_id import FileId, FileType, PHOTO_TYPES
@ -37,7 +37,7 @@ class DownloadMedia(Scaffold):
block: bool = True, block: bool = True,
progress: callable = None, progress: callable = None,
progress_args: tuple = () progress_args: tuple = ()
) -> Union[str, None]: ) -> Optional[str]:
"""Download the media from a message. """Download the media from a message.
Parameters: Parameters:

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union from typing import Optional
from pyrogram import types from pyrogram import types
from pyrogram.scaffold import Scaffold from pyrogram.scaffold import Scaffold
@ -27,7 +27,7 @@ class EditInlineCaption(Scaffold):
self, self,
inline_message_id: str, inline_message_id: str,
caption: str, caption: str,
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
reply_markup: "types.InlineKeyboardMarkup" = None reply_markup: "types.InlineKeyboardMarkup" = None
) -> bool: ) -> bool:
"""Edit the caption of inline media messages. """Edit the caption of inline media messages.

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union from typing import Optional
from pyrogram import raw from pyrogram import raw
from pyrogram import types from pyrogram import types
@ -30,7 +30,7 @@ class EditInlineText(Scaffold):
self, self,
inline_message_id: str, inline_message_id: str,
text: str, text: str,
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
disable_web_page_preview: bool = None, disable_web_page_preview: bool = None,
reply_markup: "types.InlineKeyboardMarkup" = None reply_markup: "types.InlineKeyboardMarkup" = None
) -> bool: ) -> bool:

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union, List from typing import Union, List, Optional
from pyrogram import types from pyrogram import types
from pyrogram.scaffold import Scaffold from pyrogram.scaffold import Scaffold
@ -28,7 +28,7 @@ class EditMessageCaption(Scaffold):
chat_id: Union[int, str], chat_id: Union[int, str],
message_id: int, message_id: int,
caption: str, caption: str,
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List["types.MessageEntity"] = None, caption_entities: List["types.MessageEntity"] = None,
reply_markup: "types.InlineKeyboardMarkup" = None reply_markup: "types.InlineKeyboardMarkup" = None
) -> "types.Message": ) -> "types.Message":

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union, List from typing import Union, List, Optional
from pyrogram import raw from pyrogram import raw
from pyrogram import types from pyrogram import types
@ -30,7 +30,7 @@ class EditMessageText(Scaffold):
chat_id: Union[int, str], chat_id: Union[int, str],
message_id: int, message_id: int,
text: str, text: str,
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
entities: List["types.MessageEntity"] = None, entities: List["types.MessageEntity"] = None,
disable_web_page_preview: bool = None, disable_web_page_preview: bool = None,
reply_markup: "types.InlineKeyboardMarkup" = None reply_markup: "types.InlineKeyboardMarkup" = None

View File

@ -18,7 +18,7 @@
import os import os
import re import re
from typing import Union, BinaryIO, List from typing import Union, BinaryIO, List, Optional
from pyrogram import StopTransmission from pyrogram import StopTransmission
from pyrogram import raw from pyrogram import raw
@ -36,7 +36,7 @@ class SendAnimation(Scaffold):
animation: Union[str, BinaryIO], animation: Union[str, BinaryIO],
caption: str = "", caption: str = "",
unsave: bool = False, unsave: bool = False,
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List["types.MessageEntity"] = None, caption_entities: List["types.MessageEntity"] = None,
duration: int = 0, duration: int = 0,
width: int = 0, width: int = 0,
@ -54,7 +54,7 @@ class SendAnimation(Scaffold):
] = None, ] = None,
progress: callable = None, progress: callable = None,
progress_args: tuple = () progress_args: tuple = ()
) -> Union["types.Message", None]: ) -> Optional["types.Message"]:
"""Send animation files (animation or H.264/MPEG-4 AVC video without sound). """Send animation files (animation or H.264/MPEG-4 AVC video without sound).
Parameters: Parameters:

View File

@ -18,7 +18,7 @@
import os import os
import re import re
from typing import Union, BinaryIO, List from typing import Union, BinaryIO, List, Optional
from pyrogram import StopTransmission from pyrogram import StopTransmission
from pyrogram import raw from pyrogram import raw
@ -35,7 +35,7 @@ class SendAudio(Scaffold):
chat_id: Union[int, str], chat_id: Union[int, str],
audio: Union[str, BinaryIO], audio: Union[str, BinaryIO],
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List["types.MessageEntity"] = None, caption_entities: List["types.MessageEntity"] = None,
duration: int = 0, duration: int = 0,
performer: str = None, performer: str = None,
@ -53,7 +53,7 @@ class SendAudio(Scaffold):
] = None, ] = None,
progress: callable = None, progress: callable = None,
progress_args: tuple = () progress_args: tuple = ()
) -> Union["types.Message", None]: ) -> Optional["types.Message"]:
"""Send audio files. """Send audio files.
For sending voice messages, use the :meth:`~pyrogram.Client.send_voice` method instead. For sending voice messages, use the :meth:`~pyrogram.Client.send_voice` method instead.

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union, List from typing import Union, List, Optional
from pyrogram import raw from pyrogram import raw
from pyrogram import types from pyrogram import types
@ -30,7 +30,7 @@ class SendCachedMedia(Scaffold):
chat_id: Union[int, str], chat_id: Union[int, str],
file_id: str, file_id: str,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List["types.MessageEntity"] = None, caption_entities: List["types.MessageEntity"] = None,
disable_notification: bool = None, disable_notification: bool = None,
reply_to_message_id: int = None, reply_to_message_id: int = None,
@ -41,7 +41,7 @@ class SendCachedMedia(Scaffold):
"types.ReplyKeyboardRemove", "types.ReplyKeyboardRemove",
"types.ForceReply" "types.ForceReply"
] = None ] = None
) -> Union["types.Message", None]: ) -> Optional["types.Message"]:
"""Send any media stored on the Telegram servers using a file_id. """Send any media stored on the Telegram servers using a file_id.
This convenience method works with any valid file_id only. This convenience method works with any valid file_id only.

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union from typing import Union, Optional
from pyrogram import raw from pyrogram import raw
from pyrogram import types from pyrogram import types
@ -37,7 +37,7 @@ class SendDice(Scaffold):
"types.ReplyKeyboardRemove", "types.ReplyKeyboardRemove",
"types.ForceReply" "types.ForceReply"
] = None ] = None
) -> Union["types.Message", None]: ) -> Optional["types.Message"]:
"""Send a dice with a random value from 1 to 6. """Send a dice with a random value from 1 to 6.
Parameters: Parameters:

View File

@ -18,7 +18,7 @@
import os import os
import re import re
from typing import Union, BinaryIO, List from typing import Union, BinaryIO, List, Optional
from pyrogram import StopTransmission from pyrogram import StopTransmission
from pyrogram import raw from pyrogram import raw
@ -36,7 +36,7 @@ class SendDocument(Scaffold):
document: Union[str, BinaryIO], document: Union[str, BinaryIO],
thumb: Union[str, BinaryIO] = None, thumb: Union[str, BinaryIO] = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List["types.MessageEntity"] = None, caption_entities: List["types.MessageEntity"] = None,
file_name: str = None, file_name: str = None,
force_document: bool = None, force_document: bool = None,
@ -51,7 +51,7 @@ class SendDocument(Scaffold):
] = None, ] = None,
progress: callable = None, progress: callable = None,
progress_args: tuple = () progress_args: tuple = ()
) -> Union["types.Message", None]: ) -> Optional["types.Message"]:
"""Send generic files. """Send generic files.
Parameters: Parameters:

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union, List from typing import Union, List, Optional
from pyrogram import raw, utils from pyrogram import raw, utils
from pyrogram import types from pyrogram import types
@ -28,7 +28,7 @@ class SendMessage(Scaffold):
self, self,
chat_id: Union[int, str], chat_id: Union[int, str],
text: str, text: str,
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
entities: List["types.MessageEntity"] = None, entities: List["types.MessageEntity"] = None,
disable_web_page_preview: bool = None, disable_web_page_preview: bool = None,
disable_notification: bool = None, disable_notification: bool = None,

View File

@ -18,7 +18,7 @@
import os import os
import re import re
from typing import Union, BinaryIO, List from typing import Union, BinaryIO, List, Optional
import pyrogram import pyrogram
from pyrogram import raw from pyrogram import raw
@ -35,7 +35,7 @@ class SendPhoto(Scaffold):
chat_id: Union[int, str], chat_id: Union[int, str],
photo: Union[str, BinaryIO], photo: Union[str, BinaryIO],
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List["types.MessageEntity"] = None, caption_entities: List["types.MessageEntity"] = None,
ttl_seconds: int = None, ttl_seconds: int = None,
disable_notification: bool = None, disable_notification: bool = None,
@ -49,7 +49,7 @@ class SendPhoto(Scaffold):
] = None, ] = None,
progress: callable = None, progress: callable = None,
progress_args: tuple = () progress_args: tuple = ()
) -> Union["types.Message", None]: ) -> Optional["types.Message"]:
"""Send photos. """Send photos.
Parameters: Parameters:

View File

@ -18,7 +18,7 @@
import os import os
import re import re
from typing import Union, BinaryIO from typing import Union, BinaryIO, Optional
from pyrogram import StopTransmission from pyrogram import StopTransmission
from pyrogram import raw from pyrogram import raw
@ -45,7 +45,7 @@ class SendSticker(Scaffold):
] = None, ] = None,
progress: callable = None, progress: callable = None,
progress_args: tuple = () progress_args: tuple = ()
) -> Union["types.Message", None]: ) -> Optional["types.Message"]:
"""Send static .webp or animated .tgs stickers. """Send static .webp or animated .tgs stickers.
Parameters: Parameters:

View File

@ -18,7 +18,7 @@
import os import os
import re import re
from typing import Union, BinaryIO, List from typing import Union, BinaryIO, List, Optional
from pyrogram import StopTransmission from pyrogram import StopTransmission
from pyrogram import raw from pyrogram import raw
@ -35,7 +35,7 @@ class SendVideo(Scaffold):
chat_id: Union[int, str], chat_id: Union[int, str],
video: Union[str, BinaryIO], video: Union[str, BinaryIO],
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List["types.MessageEntity"] = None, caption_entities: List["types.MessageEntity"] = None,
ttl_seconds: int = None, ttl_seconds: int = None,
duration: int = 0, duration: int = 0,
@ -55,7 +55,7 @@ class SendVideo(Scaffold):
] = None, ] = None,
progress: callable = None, progress: callable = None,
progress_args: tuple = () progress_args: tuple = ()
) -> Union["types.Message", None]: ) -> Optional["types.Message"]:
"""Send video files. """Send video files.
Parameters: Parameters:

View File

@ -17,7 +17,7 @@
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
import os import os
from typing import Union, BinaryIO from typing import Union, BinaryIO, Optional
from pyrogram import StopTransmission from pyrogram import StopTransmission
from pyrogram import raw from pyrogram import raw
@ -47,7 +47,7 @@ class SendVideoNote(Scaffold):
] = None, ] = None,
progress: callable = None, progress: callable = None,
progress_args: tuple = () progress_args: tuple = ()
) -> Union["types.Message", None]: ) -> Optional["types.Message"]:
"""Send video messages. """Send video messages.
Parameters: Parameters:

View File

@ -18,7 +18,7 @@
import os import os
import re import re
from typing import Union, BinaryIO, List from typing import Union, BinaryIO, List, Optional
from pyrogram import StopTransmission from pyrogram import StopTransmission
from pyrogram import raw from pyrogram import raw
@ -35,7 +35,7 @@ class SendVoice(Scaffold):
chat_id: Union[int, str], chat_id: Union[int, str],
voice: Union[str, BinaryIO], voice: Union[str, BinaryIO],
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List["types.MessageEntity"] = None, caption_entities: List["types.MessageEntity"] = None,
duration: int = 0, duration: int = 0,
disable_notification: bool = None, disable_notification: bool = None,
@ -49,7 +49,7 @@ class SendVoice(Scaffold):
] = None, ] = None,
progress: callable = None, progress: callable = None,
progress_args: tuple = () progress_args: tuple = ()
) -> Union["types.Message", None]: ) -> Optional["types.Message"]:
"""Send audio files. """Send audio files.
Parameters: Parameters:

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union from typing import Optional
from pyrogram import raw from pyrogram import raw
from pyrogram.scaffold import Scaffold from pyrogram.scaffold import Scaffold
@ -25,7 +25,7 @@ from pyrogram.scaffold import Scaffold
class UpdateUsername(Scaffold): class UpdateUsername(Scaffold):
async def update_username( async def update_username(
self, self,
username: Union[str, None] username: Optional[str]
) -> bool: ) -> bool:
"""Update your own username. """Update your own username.

View File

@ -20,7 +20,7 @@ import html
import logging import logging
import re import re
from html.parser import HTMLParser from html.parser import HTMLParser
from typing import Union from typing import Optional
import pyrogram import pyrogram
from pyrogram import raw from pyrogram import raw
@ -106,7 +106,7 @@ class Parser(HTMLParser):
class HTML: class HTML:
def __init__(self, client: Union["pyrogram.Client", None]): def __init__(self, client: Optional["pyrogram.Client"]):
self.client = client self.client = client
async def parse(self, text: str): async def parse(self, text: str):

View File

@ -18,7 +18,7 @@
import html import html
import re import re
from typing import Union from typing import Optional
import pyrogram import pyrogram
from . import utils from . import utils
@ -53,7 +53,7 @@ FIXED_WIDTH_DELIMS = [CODE_DELIM, PRE_DELIM]
class Markdown: class Markdown:
def __init__(self, client: Union["pyrogram.Client", None]): def __init__(self, client: Optional["pyrogram.Client"]):
self.html = HTML(client) self.html = HTML(client)
async def parse(self, text: str, strict: bool = False): async def parse(self, text: str, strict: bool = False):

View File

@ -17,7 +17,7 @@
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from collections import OrderedDict from collections import OrderedDict
from typing import Union from typing import Optional
import pyrogram import pyrogram
from .html import HTML from .html import HTML
@ -25,12 +25,12 @@ from .markdown import Markdown
class Parser: class Parser:
def __init__(self, client: Union["pyrogram.Client", None]): def __init__(self, client: Optional["pyrogram.Client"]):
self.client = client self.client = client
self.html = HTML(client) self.html = HTML(client)
self.markdown = Markdown(client) self.markdown = Markdown(client)
async def parse(self, text: str, mode: Union[str, None] = object): async def parse(self, text: str, mode: Optional[str] = object):
text = str(text).strip() text = str(text).strip()
if mode == object: if mode == object:

View File

@ -18,7 +18,7 @@
from base64 import b64encode from base64 import b64encode
from struct import pack from struct import pack
from typing import Union, List, Match from typing import Union, List, Match, Optional
import pyrogram import pyrogram
from pyrogram import raw from pyrogram import raw
@ -171,7 +171,7 @@ class CallbackQuery(Object, Update):
async def edit_message_text( async def edit_message_text(
self, self,
text: str, text: str,
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
disable_web_page_preview: bool = None, disable_web_page_preview: bool = None,
reply_markup: "types.InlineKeyboardMarkup" = None reply_markup: "types.InlineKeyboardMarkup" = None
) -> Union["types.Message", bool]: ) -> Union["types.Message", bool]:
@ -224,7 +224,7 @@ class CallbackQuery(Object, Update):
async def edit_message_caption( async def edit_message_caption(
self, self,
caption: str, caption: str,
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
reply_markup: "types.InlineKeyboardMarkup" = None reply_markup: "types.InlineKeyboardMarkup" = None
) -> Union["types.Message", bool]: ) -> Union["types.Message", bool]:
"""Edit the caption of media messages attached to callback queries. """Edit the caption of media messages attached to callback queries.

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union from typing import Optional
from pyrogram import raw from pyrogram import raw
from pyrogram import types from pyrogram import types
@ -75,7 +75,7 @@ class InlineQueryResultAnimation(InlineQueryResult):
title: str = None, title: str = None,
description: str = None, description: str = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
reply_markup: "types.InlineKeyboardMarkup" = None, reply_markup: "types.InlineKeyboardMarkup" = None,
input_message_content: "types.InputMessageContent" = None input_message_content: "types.InputMessageContent" = None
): ):

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union from typing import Optional
from pyrogram import raw from pyrogram import raw
from pyrogram import types from pyrogram import types
@ -75,7 +75,7 @@ class InlineQueryResultPhoto(InlineQueryResult):
title: str = None, title: str = None,
description: str = None, description: str = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
reply_markup: "types.InlineKeyboardMarkup" = None, reply_markup: "types.InlineKeyboardMarkup" = None,
input_message_content: "types.InputMessageContent" = None input_message_content: "types.InputMessageContent" = None
): ):

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union, List from typing import Optional, List
from .input_media import InputMedia from .input_media import InputMedia
from ..messages_and_media import MessageEntity from ..messages_and_media import MessageEntity
@ -65,7 +65,7 @@ class InputMediaAnimation(InputMedia):
media: str, media: str,
thumb: str = None, thumb: str = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List[MessageEntity] = None, caption_entities: List[MessageEntity] = None,
width: int = 0, width: int = 0,
height: int = 0, height: int = 0,

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union, List from typing import Optional, List
from .input_media import InputMedia from .input_media import InputMedia
from ..messages_and_media import MessageEntity from ..messages_and_media import MessageEntity
@ -67,7 +67,7 @@ class InputMediaAudio(InputMedia):
media: str, media: str,
thumb: str = None, thumb: str = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List[MessageEntity] = None, caption_entities: List[MessageEntity] = None,
duration: int = 0, duration: int = 0,
performer: str = "", performer: str = "",

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union, List from typing import Optional, List
from .input_media import InputMedia from .input_media import InputMedia
from ..messages_and_media import MessageEntity from ..messages_and_media import MessageEntity
@ -56,7 +56,7 @@ class InputMediaDocument(InputMedia):
media: str, media: str,
thumb: str = None, thumb: str = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List[MessageEntity] = None caption_entities: List[MessageEntity] = None
): ):
super().__init__(media, caption, parse_mode, caption_entities) super().__init__(media, caption, parse_mode, caption_entities)

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union, List from typing import Optional, List
from .input_media import InputMedia from .input_media import InputMedia
from ..messages_and_media import MessageEntity from ..messages_and_media import MessageEntity
@ -51,7 +51,7 @@ class InputMediaPhoto(InputMedia):
self, self,
media: str, media: str,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List[MessageEntity] = None caption_entities: List[MessageEntity] = None
): ):
super().__init__(media, caption, parse_mode, caption_entities) super().__init__(media, caption, parse_mode, caption_entities)

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union, List from typing import Optional, List
from .input_media import InputMedia from .input_media import InputMedia
from ..messages_and_media import MessageEntity from ..messages_and_media import MessageEntity
@ -70,7 +70,7 @@ class InputMediaVideo(InputMedia):
media: str, media: str,
thumb: str = None, thumb: str = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List[MessageEntity] = None, caption_entities: List[MessageEntity] = None,
width: int = 0, width: int = 0,
height: int = 0, height: int = 0,

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union from typing import Optional
from pyrogram import raw from pyrogram import raw
from pyrogram.parser import Parser from pyrogram.parser import Parser
@ -41,7 +41,7 @@ class InputTextMessageContent(InputMessageContent):
Disables link previews for links in this message. Disables link previews for links in this message.
""" """
def __init__(self, message_text: str, parse_mode: Union[str, None] = object, disable_web_page_preview: bool = None): def __init__(self, message_text: str, parse_mode: Optional[str] = object, disable_web_page_preview: bool = None):
super().__init__() super().__init__()
self.message_text = message_text self.message_text = message_text

View File

@ -18,7 +18,7 @@
import logging import logging
from functools import partial from functools import partial
from typing import List, Match, Union, BinaryIO from typing import List, Match, Union, BinaryIO, Optional
import pyrogram import pyrogram
from pyrogram import raw from pyrogram import raw
@ -710,7 +710,7 @@ class Message(Object, Update):
self, self,
text: str, text: str,
quote: bool = None, quote: bool = None,
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
entities: List["types.MessageEntity"] = None, entities: List["types.MessageEntity"] = None,
disable_web_page_preview: bool = None, disable_web_page_preview: bool = None,
disable_notification: bool = None, disable_notification: bool = None,
@ -797,7 +797,7 @@ class Message(Object, Update):
animation: Union[str, BinaryIO], animation: Union[str, BinaryIO],
quote: bool = None, quote: bool = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List["types.MessageEntity"] = None, caption_entities: List["types.MessageEntity"] = None,
duration: int = 0, duration: int = 0,
width: int = 0, width: int = 0,
@ -939,7 +939,7 @@ class Message(Object, Update):
audio: Union[str, BinaryIO], audio: Union[str, BinaryIO],
quote: bool = None, quote: bool = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List["types.MessageEntity"] = None, caption_entities: List["types.MessageEntity"] = None,
duration: int = 0, duration: int = 0,
performer: str = None, performer: str = None,
@ -1081,7 +1081,7 @@ class Message(Object, Update):
file_id: str, file_id: str,
quote: bool = None, quote: bool = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List["types.MessageEntity"] = None, caption_entities: List["types.MessageEntity"] = None,
disable_notification: bool = None, disable_notification: bool = None,
reply_to_message_id: int = None, reply_to_message_id: int = None,
@ -1294,7 +1294,7 @@ class Message(Object, Update):
quote: bool = None, quote: bool = None,
thumb: str = None, thumb: str = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List["types.MessageEntity"] = None, caption_entities: List["types.MessageEntity"] = None,
disable_notification: bool = None, disable_notification: bool = None,
reply_to_message_id: int = None, reply_to_message_id: int = None,
@ -1694,7 +1694,7 @@ class Message(Object, Update):
photo: Union[str, BinaryIO], photo: Union[str, BinaryIO],
quote: bool = None, quote: bool = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List["types.MessageEntity"] = None, caption_entities: List["types.MessageEntity"] = None,
ttl_seconds: int = None, ttl_seconds: int = None,
disable_notification: bool = None, disable_notification: bool = None,
@ -2122,7 +2122,7 @@ class Message(Object, Update):
video: Union[str, BinaryIO], video: Union[str, BinaryIO],
quote: bool = None, quote: bool = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List["types.MessageEntity"] = None, caption_entities: List["types.MessageEntity"] = None,
ttl_seconds: int = None, ttl_seconds: int = None,
duration: int = 0, duration: int = 0,
@ -2394,7 +2394,7 @@ class Message(Object, Update):
voice: Union[str, BinaryIO], voice: Union[str, BinaryIO],
quote: bool = None, quote: bool = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List["types.MessageEntity"] = None, caption_entities: List["types.MessageEntity"] = None,
duration: int = 0, duration: int = 0,
disable_notification: bool = None, disable_notification: bool = None,
@ -2516,7 +2516,7 @@ class Message(Object, Update):
async def edit_text( async def edit_text(
self, self,
text: str, text: str,
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
entities: List["types.MessageEntity"] = None, entities: List["types.MessageEntity"] = None,
disable_web_page_preview: bool = None, disable_web_page_preview: bool = None,
reply_markup: "types.InlineKeyboardMarkup" = None reply_markup: "types.InlineKeyboardMarkup" = None
@ -2579,7 +2579,7 @@ class Message(Object, Update):
async def edit_caption( async def edit_caption(
self, self,
caption: str, caption: str,
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List["types.MessageEntity"] = None, caption_entities: List["types.MessageEntity"] = None,
reply_markup: "types.InlineKeyboardMarkup" = None reply_markup: "types.InlineKeyboardMarkup" = None
) -> "Message": ) -> "Message":
@ -2711,7 +2711,7 @@ class Message(Object, Update):
async def forward( async def forward(
self, self,
chat_id: int or str, chat_id: Union[int, str],
disable_notification: bool = None, disable_notification: bool = None,
schedule_date: int = None schedule_date: int = None
) -> Union["types.Message", List["types.Message"]]: ) -> Union["types.Message", List["types.Message"]]:
@ -2763,7 +2763,7 @@ class Message(Object, Update):
self, self,
chat_id: Union[int, str], chat_id: Union[int, str],
caption: str = None, caption: str = None,
parse_mode: Union[str, None] = object, parse_mode: Optional[str] = object,
caption_entities: List["types.MessageEntity"] = None, caption_entities: List["types.MessageEntity"] = None,
disable_notification: bool = None, disable_notification: bool = None,
reply_to_message_id: int = None, reply_to_message_id: int = None,
@ -2975,7 +2975,7 @@ class Message(Object, Update):
revoke=revoke revoke=revoke
) )
async def click(self, x: int or str = 0, y: int = None, quote: bool = None, timeout: int = 10): async def click(self, x: Union[int, str] = 0, y: int = None, quote: bool = None, timeout: int = 10):
"""Bound method *click* of :obj:`~pyrogram.types.Message`. """Bound method *click* of :obj:`~pyrogram.types.Message`.
Use as a shortcut for clicking a button attached to the message instead of: Use as a shortcut for clicking a button attached to the message instead of:

View File

@ -17,6 +17,7 @@
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from enum import Enum, auto from enum import Enum, auto
from typing import Optional
import pyrogram import pyrogram
from pyrogram import raw from pyrogram import raw
@ -121,7 +122,7 @@ class MessageEntity(Object):
self.language = language self.language = language
@staticmethod @staticmethod
def _parse(client, entity, users: dict) -> "MessageEntity" or None: def _parse(client, entity, users: dict) -> Optional["MessageEntity"]:
type = RAW_ENTITIES_TO_TYPE.get(entity.__class__, None) type = RAW_ENTITIES_TO_TYPE.get(entity.__class__, None)
if type is None: if type is None:

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union, List from typing import Union, List, Optional
import pyrogram import pyrogram
from pyrogram import raw from pyrogram import raw
@ -68,7 +68,7 @@ class Thumbnail(Object):
def _parse( def _parse(
client, client,
media: Union["raw.types.Photo", "raw.types.Document"] media: Union["raw.types.Photo", "raw.types.Document"]
) -> Union[List[Union["types.StrippedThumbnail", "Thumbnail"]], None]: ) -> Optional[List[Union["types.StrippedThumbnail", "Thumbnail"]]]:
if isinstance(media, raw.types.Photo): if isinstance(media, raw.types.Photo):
raw_thumbnails = media.sizes[:-1] raw_thumbnails = media.sizes[:-1]
elif isinstance(media, raw.types.Document): elif isinstance(media, raw.types.Document):

View File

@ -229,7 +229,7 @@ class Chat(Object):
) )
@staticmethod @staticmethod
def _parse(client, message: raw.types.Message or raw.types.MessageService, users: dict, chats: dict) -> "Chat": def _parse(client, message: Union[raw.types.Message, raw.types.MessageService], users: dict, chats: dict) -> "Chat":
if isinstance(message.peer_id, raw.types.PeerUser): if isinstance(message.peer_id, raw.types.PeerUser):
return Chat._parse_user_chat(client, users[message.peer_id.user_id]) return Chat._parse_user_chat(client, users[message.peer_id.user_id])
@ -248,7 +248,7 @@ class Chat(Object):
return Chat._parse_channel_chat(client, chats[peer.channel_id]) return Chat._parse_channel_chat(client, chats[peer.channel_id])
@staticmethod @staticmethod
async def _parse_full(client, chat_full: raw.types.messages.ChatFull or raw.types.UserFull) -> "Chat": async def _parse_full(client, chat_full: Union[raw.types.messages.ChatFull, raw.types.UserFull]) -> "Chat":
if isinstance(chat_full, raw.types.UserFull): if isinstance(chat_full, raw.types.UserFull):
parsed_chat = Chat._parse_user_chat(client, chat_full.user) parsed_chat = Chat._parse_user_chat(client, chat_full.user)
parsed_chat.bio = chat_full.about parsed_chat.bio = chat_full.about

View File

@ -17,7 +17,7 @@
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
import html import html
from typing import List from typing import List, Optional
import pyrogram import pyrogram
from pyrogram import raw from pyrogram import raw
@ -201,7 +201,7 @@ class User(Object, Update):
return Link(f"tg://user?id={self.id}", self.first_name, self._client.parse_mode) return Link(f"tg://user?id={self.id}", self.first_name, self._client.parse_mode)
@staticmethod @staticmethod
def _parse(client, user: "raw.types.User") -> "User" or None: def _parse(client, user: "raw.types.User") -> Optional["User"]:
if user is None: if user is None:
return None return None

View File

@ -24,7 +24,7 @@ import os
import struct import struct
from concurrent.futures.thread import ThreadPoolExecutor from concurrent.futures.thread import ThreadPoolExecutor
from getpass import getpass from getpass import getpass
from typing import Union, List, Dict from typing import Union, List, Dict, Optional
import pyrogram import pyrogram
from pyrogram import raw from pyrogram import raw
@ -168,7 +168,7 @@ MIN_CHAT_ID = -2147483647
MAX_USER_ID = 2147483647 MAX_USER_ID = 2147483647
def get_raw_peer_id(peer: raw.base.Peer) -> Union[int, None]: def get_raw_peer_id(peer: raw.base.Peer) -> Optional[int]:
"""Get the raw peer id from a Peer object""" """Get the raw peer id from a Peer object"""
if isinstance(peer, raw.types.PeerUser): if isinstance(peer, raw.types.PeerUser):
return peer.user_id return peer.user_id