diff --git a/aiogram/contrib/fsm_storage/mongo.py b/aiogram/contrib/fsm_storage/mongo.py index f810a3eb..aaf903f0 100644 --- a/aiogram/contrib/fsm_storage/mongo.py +++ b/aiogram/contrib/fsm_storage/mongo.py @@ -206,12 +206,5 @@ class MongoStorage(BaseStorage): :return: list of tuples where first element is chat id and second is user id """ db = await self.get_db() - result = [] - items = await db[STATE].find().to_list() - for item in items: - result.append( - (int(item['chat']), int(item['user'])) - ) - - return result + return [(int(item['chat']), int(item['user'])) for item in items] diff --git a/aiogram/dispatcher/dispatcher.py b/aiogram/dispatcher/dispatcher.py index b38d3af1..3cd071a9 100644 --- a/aiogram/dispatcher/dispatcher.py +++ b/aiogram/dispatcher/dispatcher.py @@ -219,15 +219,10 @@ class Dispatcher(DataMixin, ContextInstanceMixin): :return: """ if fast: - tasks = [] - for update in updates: - tasks.append(self.updates_handler.notify(update)) + tasks = [self.updates_handler.notify(update) for update in updates] return await asyncio.gather(*tasks) - results = [] - for update in updates: - results.append(await self.updates_handler.notify(update)) - return results + return [await self.updates_handler.notify(update) for update in updates] async def process_update(self, update: types.Update): """ diff --git a/aiogram/dispatcher/filters/builtin.py b/aiogram/dispatcher/filters/builtin.py index 20317f57..f3425386 100644 --- a/aiogram/dispatcher/filters/builtin.py +++ b/aiogram/dispatcher/filters/builtin.py @@ -278,9 +278,11 @@ class Text(Filter): elif check == 0: raise ValueError(f"No one mode is specified!") - equals, contains, endswith, startswith = map(lambda e: [e] if isinstance(e, str) or isinstance(e, LazyProxy) - else e, - (equals, contains, endswith, startswith)) + equals, contains, endswith, startswith = map( + lambda e: [e] if isinstance(e, (str, LazyProxy)) else e, + (equals, contains, endswith, startswith), + ) + self.equals = equals self.contains = contains self.endswith = endswith diff --git a/aiogram/dispatcher/filters/factory.py b/aiogram/dispatcher/filters/factory.py index 564e7f89..d53047d5 100644 --- a/aiogram/dispatcher/filters/factory.py +++ b/aiogram/dispatcher/filters/factory.py @@ -48,9 +48,13 @@ class FiltersFactory: :param full_config: :return: """ - filters_set = [] - filters_set.extend(self._resolve_registered(event_handler, - {k: v for k, v in full_config.items() if v is not None})) + filters_set = list( + self._resolve_registered( + event_handler, + {k: v for k, v in full_config.items() if v is not None}, + ) + ) + if custom_filters: filters_set.extend(custom_filters) diff --git a/aiogram/dispatcher/filters/filters.py b/aiogram/dispatcher/filters/filters.py index 220ef96c..47a4f22e 100644 --- a/aiogram/dispatcher/filters/filters.py +++ b/aiogram/dispatcher/filters/filters.py @@ -242,7 +242,7 @@ class NotFilter(_LogicFilter): class AndFilter(_LogicFilter): def __init__(self, *targets): - self.targets = list(wrap_async(target) for target in targets) + self.targets = [wrap_async(target) for target in targets] async def check(self, *args): """ @@ -268,7 +268,7 @@ class AndFilter(_LogicFilter): class OrFilter(_LogicFilter): def __init__(self, *targets): - self.targets = list(wrap_async(target) for target in targets) + self.targets = [wrap_async(target) for target in targets] async def check(self, *args): """ diff --git a/aiogram/dispatcher/handler.py b/aiogram/dispatcher/handler.py index 38219012..10a94924 100644 --- a/aiogram/dispatcher/handler.py +++ b/aiogram/dispatcher/handler.py @@ -25,8 +25,7 @@ class CancelHandler(Exception): def _get_spec(func: callable): while hasattr(func, '__wrapped__'): # Try to resolve decorated callbacks func = func.__wrapped__ - spec = inspect.getfullargspec(func) - return spec + return inspect.getfullargspec(func) def _check_spec(spec: inspect.FullArgSpec, kwargs: dict): diff --git a/aiogram/dispatcher/storage.py b/aiogram/dispatcher/storage.py index a2992322..f02f6559 100644 --- a/aiogram/dispatcher/storage.py +++ b/aiogram/dispatcher/storage.py @@ -54,9 +54,9 @@ class BaseStorage: if chat is None and user is None: raise ValueError('`user` or `chat` parameter is required but no one is provided!') - if user is None and chat is not None: + if user is None: user = chat - elif user is not None and chat is None: + elif chat is None: chat = user return chat, user diff --git a/aiogram/dispatcher/webhook.py b/aiogram/dispatcher/webhook.py index 5199d591..803651ce 100644 --- a/aiogram/dispatcher/webhook.py +++ b/aiogram/dispatcher/webhook.py @@ -116,8 +116,7 @@ class WebhookRequestHandler(web.View): :return: :class:`aiogram.types.Update` """ data = await self.request.json() - update = types.Update(**data) - return update + return types.Update(**data) async def post(self): """ diff --git a/aiogram/types/base.py b/aiogram/types/base.py index e64d3398..4aae01ab 100644 --- a/aiogram/types/base.py +++ b/aiogram/types/base.py @@ -242,8 +242,7 @@ class TelegramObject(ContextInstanceMixin, metaclass=MetaTelegramObject): :return: """ - for item in self.to_python().items(): - yield item + yield from self.to_python().items() def iter_keys(self) -> typing.Generator[typing.Any, None, None]: """ diff --git a/aiogram/types/fields.py b/aiogram/types/fields.py index 022b9b72..4f88e3b0 100644 --- a/aiogram/types/fields.py +++ b/aiogram/types/fields.py @@ -129,18 +129,12 @@ class ListField(Field): super(ListField, self).__init__(*args, default=default, **kwargs) def serialize(self, value): - result = [] serialize = super(ListField, self).serialize - for item in value: - result.append(serialize(item)) - return result + return [serialize(item) for item in value] def deserialize(self, value, parent=None): - result = [] deserialize = super(ListField, self).deserialize - for item in value: - result.append(deserialize(item, parent=parent)) - return result + return [deserialize(item, parent=parent) for item in value] class ListOfLists(Field): @@ -148,9 +142,7 @@ class ListOfLists(Field): result = [] serialize = super(ListOfLists, self).serialize for row in value: - row_result = [] - for item in row: - row_result.append(serialize(item)) + row_result = [serialize(item) for item in row] result.append(row_result) return result @@ -159,9 +151,7 @@ class ListOfLists(Field): deserialize = super(ListOfLists, self).deserialize if hasattr(value, '__iter__'): for row in value: - row_result = [] - for item in row: - row_result.append(deserialize(item, parent=parent)) + row_result = [deserialize(item, parent=parent) for item in row] result.append(row_result) return result diff --git a/aiogram/types/inline_keyboard.py b/aiogram/types/inline_keyboard.py index 97ad35da..195c1e67 100644 --- a/aiogram/types/inline_keyboard.py +++ b/aiogram/types/inline_keyboard.py @@ -50,7 +50,7 @@ class InlineKeyboardMarkup(base.TelegramObject): if index % self.row_width == 0: self.inline_keyboard.append(row) row = [] - if len(row) > 0: + if row: self.inline_keyboard.append(row) return self @@ -62,9 +62,7 @@ class InlineKeyboardMarkup(base.TelegramObject): :return: self :rtype: :obj:`types.InlineKeyboardMarkup` """ - btn_array = [] - for button in args: - btn_array.append(button) + btn_array = [button for button in args] self.inline_keyboard.append(btn_array) return self diff --git a/aiogram/types/input_file.py b/aiogram/types/input_file.py index 3c397395..13e37679 100644 --- a/aiogram/types/input_file.py +++ b/aiogram/types/input_file.py @@ -39,10 +39,7 @@ class InputFile(base.TelegramObject): self._path = path_or_bytesio if filename is None: filename = os.path.split(path_or_bytesio)[-1] - elif isinstance(path_or_bytesio, io.IOBase): - self._path = None - self._file = path_or_bytesio - elif isinstance(path_or_bytesio, _WebPipe): + elif isinstance(path_or_bytesio, (io.IOBase, _WebPipe)): self._path = None self._file = path_or_bytesio else: @@ -166,10 +163,7 @@ class _WebPipe: def name(self): if not self._name: *_, part = self.url.rpartition('/') - if part: - self._name = part - else: - self._name = secrets.token_urlsafe(24) + self._name = part or secrets.token_urlsafe(24) return self._name async def open(self): diff --git a/aiogram/types/message_entity.py b/aiogram/types/message_entity.py index 77b23c5c..550a432c 100644 --- a/aiogram/types/message_entity.py +++ b/aiogram/types/message_entity.py @@ -30,11 +30,7 @@ class MessageEntity(base.TelegramObject): if sys.maxunicode == 0xffff: return text[self.offset:self.offset + self.length] - if not isinstance(text, bytes): - entity_text = text.encode('utf-16-le') - else: - entity_text = text - + entity_text = text.encode('utf-16-le') if not isinstance(text, bytes) else text entity_text = entity_text[self.offset * 2:(self.offset + self.length) * 2] return entity_text.decode('utf-16-le') diff --git a/aiogram/types/reply_keyboard.py b/aiogram/types/reply_keyboard.py index ffe07ae1..5db89e84 100644 --- a/aiogram/types/reply_keyboard.py +++ b/aiogram/types/reply_keyboard.py @@ -58,7 +58,7 @@ class ReplyKeyboardMarkup(base.TelegramObject): if index % self.row_width == 0: self.keyboard.append(row) row = [] - if len(row) > 0: + if row: self.keyboard.append(row) return self @@ -70,9 +70,7 @@ class ReplyKeyboardMarkup(base.TelegramObject): :return: self :rtype: :obj:`types.ReplyKeyboardMarkup` """ - btn_array = [] - for button in args: - btn_array.append(button) + btn_array = [button for button in args] self.keyboard.append(btn_array) return self diff --git a/aiogram/utils/helper.py b/aiogram/utils/helper.py index 735afe5d..e21e028a 100644 --- a/aiogram/utils/helper.py +++ b/aiogram/utils/helper.py @@ -70,10 +70,7 @@ class HelperMode(Helper): return text result = '' for pos, symbol in enumerate(text): - if symbol.isupper() and pos > 0: - result += '_' + symbol - else: - result += symbol.upper() + result += '_' + symbol if symbol.isupper() and pos > 0 else symbol.upper() return result @classmethod @@ -103,10 +100,7 @@ class HelperMode(Helper): if symbol == '_' and pos > 0: need_upper = True else: - if need_upper: - result += symbol.upper() - else: - result += symbol.lower() + result += symbol.upper() if need_upper else symbol.lower() need_upper = False if first_upper: result = result[0].upper() + result[1:] @@ -153,9 +147,8 @@ class Item: def __set_name__(self, owner, name): if not name.isupper(): raise NameError('Name for helper item must be in uppercase!') - if not self._value: - if hasattr(owner, 'mode'): - self._value = HelperMode.apply(name, getattr(owner, 'mode')) + if not self._value and hasattr(owner, 'mode'): + self._value = HelperMode.apply(name, getattr(owner, 'mode')) class ListItem(Item): @@ -201,10 +194,15 @@ class OrderedHelperMeta(type): def __new__(mcs, name, bases, namespace, **kwargs): cls = super().__new__(mcs, name, bases, namespace) - props_keys = [] + props_keys = [ + prop_name + for prop_name in ( + name + for name, prop in namespace.items() + if isinstance(prop, (Item, ListItem)) + ) + ] - for prop_name in (name for name, prop in namespace.items() if isinstance(prop, (Item, ListItem))): - props_keys.append(prop_name) setattr(cls, PROPS_KEYS_ATTR_NAME, props_keys) diff --git a/aiogram/utils/text_decorations.py b/aiogram/utils/text_decorations.py index 4de8d69a..56e5ec8c 100644 --- a/aiogram/utils/text_decorations.py +++ b/aiogram/utils/text_decorations.py @@ -55,12 +55,12 @@ class TextDecoration(ABC): :param entities: Array of MessageEntities :return: """ - result = "".join( + return "".join( self._unparse_entities( - self._add_surrogates(text), sorted(entities, key=lambda item: item.offset) if entities else [] + self._add_surrogates(text), + sorted(entities, key=lambda item: item.offset) if entities else [], ) ) - return result def _unparse_entities( self, diff --git a/tests/test_bot.py b/tests/test_bot.py index cf1c3c3b..e385766f 100644 --- a/tests/test_bot.py +++ b/tests/test_bot.py @@ -492,7 +492,7 @@ async def test_get_my_commands(bot: Bot, event_loop): async with FakeTelegram(message_data=commands, loop=event_loop): result = await bot.get_my_commands() assert isinstance(result, list) - assert all([isinstance(command, types.BotCommand) for command in result]) + assert all(isinstance(command, types.BotCommand) for command in result) async def test_edit_message_text_by_bot(bot: Bot, event_loop): diff --git a/tests/test_utils/test_deprecated.py b/tests/test_utils/test_deprecated.py index 114d6810..e40189c1 100644 --- a/tests/test_utils/test_deprecated.py +++ b/tests/test_utils/test_deprecated.py @@ -7,8 +7,8 @@ def test_DeprecatedReadOnlyClassVarCD(): assert DeprecatedReadOnlyClassVar.__slots__ == ("_new_value_getter", "_warning_message") new_value_of_deprecated_cls_cd = "mpa" - pseudo_owner_cls = type("OpekaCla$$", (), {}) deprecated_cd = DeprecatedReadOnlyClassVar("mopekaa", lambda owner: new_value_of_deprecated_cls_cd) with pytest.warns(DeprecationWarning): + pseudo_owner_cls = type("OpekaCla$$", (), {}) assert deprecated_cd.__get__(None, pseudo_owner_cls) == new_value_of_deprecated_cls_cd