Передача результата функции с параметром request в фикстуру

Здравствуйте.
(Необходимое примечание - в питоне я чайник, учила буквально “на ходу”, так что скорее всего проблема - закавычка с синтаксисом, которую не получилось нагуглить)
Есть проект с несколькими типами аккаунтов.
Аккаунты забиты в отдельный класс в виде сложного словаря (см. приложенный скрин).

users file

(про безопасность можно сразу пропустить - все аккаунты типовые и получивший к ним доступ получит не больше, чем при самостоятельной регистрации)

Для тестирования профиля есть фикстура, которая в начале теста выполняет авторизацию, а в конце - разлогин. Точнее, сейчас реализовано две отдельных фикстуры, одна для USERS, вторая для VENDORS и два очень похожих комплекта тестов, где они используются (да, технически это говнокод).

Код старого варианта фикстуры:

@pytest.fixture(scope="function", params=Accounts.VENDORS.values())   #быстрая авторизация для профиля вендора (перебор всех вендоров)
def log_in_vendor(server_name, request, browser):
    link = f"{server_name}{links.LOG_IN_WITH_EMAIL}"
    email, password = request.param.values()
    page = EmailLoginPage(browser, link)
    page.open()
    page.print_text_to_field(EmailLoginPageLocators.LOGIN_INPUT_EMAIL, email)
    page.print_text_to_field(EmailLoginPageLocators.LOGIN_INPUT_PASS, password)
    page.click_to_login_button()
    current_url = browser.current_url
    WebDriverWait(browser, 15).until(EC.url_changes(current_url))
    yield log_in_vendor
    print(f"\n{email}")
    page.logout()

Пытаюсь сделать одну общую фикстуру, которая будет получать из команды запуска метку, задающую тип пользователя (юзер или вендор) и в зависимости от полученного запускать прогон по нужному списку аккаунтов либо по всем сразу. Для этого попыталась написать дополнительную функцию, которая обрабатывала бы метку и возвращала готовый список аккаунтов, который получала бы фикстура. Код дополнительной функции:

def user_accounts(request):
    users = request.config.getoption("-m")
    if users == "ind_user":
        user_accounts = Accounts.USERS.values()
    elif users == "vendor":
        user_accounts = Accounts.VENDORS.values()
    else:
        user_accounts = dict(Accounts.USERS.values()).update(Accounts.VENDORS.values())
    print(user_accounts)
    return user_accounts

Вроде должно было сработать, но проблема вот в чем: чтобы получать информацию из командной строки, в функции используется параметр request. При вызове функции в качестве параметра фикстуры (params=user_accounts()) возникает ошибка “не указан 1 обязательный параметр”, тот самый request. Поиск по запросу “как сделать параметр необязательным” дает ответ “присвоить ему значение по умолчанию”, но какое значение по умолчанию можно задать параметру request, понять не получилось. Очевидный вариант None не прошел.

Что с этим можно сделать? (Вариант “все написать вообще по-другому” принимается при наличии разъяснений, как именно по-другому и чем это лучше).

Ммм… А вариант (params=user_accounts(request)) пробовали?

Пробовала, среда разработки сразу же выдает ошибку ‘“request” не определено’

А обязательно передавать юзера параметром?
Сделайте вызов вот этой функции user_accounts внутри фикстуры. Тогда request будет определён.

В этом варианте реализации - обязательно, по сути в параметр падает список аккаунтов, с которыми последовательно должна отработать фикстура, и тест запустится на каждом из аккаунтов. Внутри без параметров оно мало чем поможет.

Пока что мне предложили альтернативный вариант - вместо фикстуры сделать функции авторизации и разлогина и параметризовать сами тесты. Попробую порыть в этом направлении.

Не Ваш ли случай?
Посмотрите оба ответа, не только 1-й.

Да, что-то похожее, надо изучить внимательно. Спасибо.

Отвечу для истории, может быть еще кому-то понадобится. Получилось достичь нужного результата через hook-функцию pytest_generate_test, есть в штатной документации по pytest.
На русском: Параметризация фикстур и тестовых функций — pytest: документация
На английском: Parametrizing tests — pytest documentation