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/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..a4a58d37 100644 --- a/aiogram/types/fields.py +++ b/aiogram/types/fields.py @@ -126,42 +126,32 @@ class ListField(Field): if default is None: default = [] - super(ListField, self).__init__(*args, default=default, **kwargs) + super().__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 + serialize = super().serialize + 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 + deserialize = super().deserialize + return [deserialize(item, parent=parent) for item in value] class ListOfLists(Field): def serialize(self, value): result = [] - serialize = super(ListOfLists, self).serialize + serialize = super().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 def deserialize(self, value, parent=None): result = [] - deserialize = super(ListOfLists, self).deserialize + deserialize = super().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 @@ -183,7 +173,7 @@ class DateTimeField(Field): class TextField(Field): def __init__(self, *, prefix=None, suffix=None, default=None, alias=None): - super(TextField, self).__init__(default=default, alias=alias) + super().__init__(default=default, alias=alias) self.prefix = prefix self.suffix = suffix 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/message_entity.py b/aiogram/types/message_entity.py index f2778ed4..fa8ebb86 100644 --- a/aiogram/types/message_entity.py +++ b/aiogram/types/message_entity.py @@ -50,7 +50,11 @@ class MessageEntity(base.TelegramObject): if sys.maxunicode == 0xFFFF: return text[self.offset : self.offset + self.length] - entity_text = text.encode("utf-16-le") if not isinstance(text, bytes) else text + if not isinstance(text, bytes): + entity_text = text.encode("utf-16-le") + else: + entity_text = text + entity_text = entity_text[self.offset * 2 : (self.offset + self.length) * 2] return entity_text.decode("utf-16-le") @@ -130,4 +134,4 @@ class MessageEntityType(helper.Helper): UNDERLINE = helper.Item() # underline STRIKETHROUGH = helper.Item() # strikethrough TEXT_LINK = helper.Item() # text_link - for clickable text URLs - TEXT_MENTION = helper.Item() # text_mention - for users without usernames + TEXT_MENTION = helper.Item() # text_mention - for users without usernames \ No newline at end of file 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_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