Декораторы. Отфильтровать словари у кого 'is_admin' = True и вызывать фкнуцию которую он декорирует
def only_admin(func):
def wrapper(user):
for u in user:
if u["is_admin"] is True:
return func(u)
return wrapper
@only_admin
def create_permissions(users: list) -> None:
for user in users:
print(f'Creating permissions for {user["username"]}')
create_permissions([
{'username': 'admin', 'is_admin': True},
{'username': 'custom_user1', 'is_admin': False}, {'username': 'custom_user2', 'is_admin': False},
, ])
Ответы (2 шт):
Автор решения: falm
→ Ссылка
После декорирования получается вложенный цикл Один можно убрать
def only_admin(func):
def wrapper(user):
for u in user:
if u["is_admin"] is True:
func(u)
return wrapper
@only_admin
def create_permissions(user: dict) -> None:
print(f'Creating permissions for {user["username"]}')
Автор решения: vadim vaduxa
→ Ссылка
Видимо имеется виду это, но пихать это в декоратор имеет смысл только если есть несколько функций, требующих подобную обработку аргументов
def only_admin(key_dt):
def decor(func):
it = key_dt.items()
def wrapper(user):
return func([u for u in user if not it - u.items()])
return wrapper
return decor
@only_admin({"is_admin": True, 'role': 2})
def create_permissions(users: list) -> None:
for user in users:
print(f'Creating permissions for {user["username"]}')
create_permissions([
{'username': 'admin1', 'is_admin': True, 'role': 1},
{'username': 'admin2', 'is_admin': True, 'role': 2},
{'username': 'custom_user1', 'is_admin': False},
{'username': 'custom_user2', 'is_admin': False},
])
# Creating permissions for admin2