Do:
roles = ["Mod", "Admin"]
if any(role in [role.name for role in data.roles] for role in roles):
do something
Что он делает? Прежде всего, у нас есть «список имен ролей», составленный с выражением [role.name for role in data.roles]
. Давайте назовем это data_role_names
.
Теперь оно уменьшается до:
roles = ["Mod", "Admin"]
if any(role in data_role_names for role in roles):
do something
Тогда немного теории об итерациях. Это мои любимые посты об этом: Введение в генераторы Python и Итерации и итераторы и генераторы .
any()
ожидает повторяемость. Генератор - это «[..] особый вид итератора », итеративный.
Генератор сделан выражением в скобках. Просто попробуйте:
a = (role in data_role_names for role in roles)
print(type(a))
И это печатает:
Python 3.6.1 (default, Dec 2015, 13:05:11)
[GCC 4.8.2] on linux
<class 'generator'>
Любой () будет:
Возвращает True, если какой-либо элемент итерируемого равен true. Если итерация
пусто, вернуть False
Это означает, что для каждого role
, указанного в roles
(в вашем примере roles = ["Mod", "Admin"]
), и возвращается true
, если какой-либо из них принадлежит data_role_names
.