Генерация глобальных функций через цикл по списку

Мне нужно использовать один URL и множество путей для связи с API по http запросам через библиотеку requests Т.к. все методы используют по сути один только формат json с разными данными, я бы хотел сгенерировать глобальные функции

import requests
URL = "https://youtube.com/user/"
users = ["alpha","bravo","charlie","delta"]
for user in users:
    globals()[f] = lambda **args: requests.post(URL + users, json=args)

>>> alpha().url # возвращает url запроса
https://youtube.com/users/delta
>>> bravo(ключ = значние, ключ = значение).url #пример запроса с параметрами
https://youtube.com/users/delta

Я полагаю в том что функция возвращает данные для глобальной переменной users


Ответы (2 шт):

Автор решения: gil9red

Мне кажется лучше сделать одну функцию с параметрами и ее вызывать

Пример:

import requests

URL = "https://youtube.com/user/"

def send_post(user: str, **kwargs) -> requests.Response:
    return requests.post(URL + user, json=kwargs)

print(send_post('alpha').url)
print(send_post('bravo', ключ=значние, ключ=значение).url)
→ Ссылка
Автор решения: insolor

Создание глобальных переменных в рантайме (у вас - глобальных имен функций) - это довольно плохая идея. Вместо этого в данном случае лучше использовать словарь:

import requests

URL = "https://youtube.com/user/"
users = ["alpha","bravo","charlie","delta"]
functions = dict()

for user in users:
    functions[user] = lambda **args: requests.post(URL + users, json=args)

# Вызов:
functions["alpha"](**some_args)

# Вызов в цикле:
for user in users:
   functions[user](**some_args)

В вашем варианте вызов функций выглядел бы вот так:

alpha(**some_args)

for user in users:
   globals()[user](**some_args)

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

Основной недостаток вашего подхода в том, что при записи в globals() функции складываются в общее глобальное пространство имен, и если у вас случайно окажется пользователь с именем, как у какой-то глобальной переменной, которая у вас уже была, то значение вашей глобальной переменной заменится на функцию. К примеру, пользователь requests (реально существующий) легко сломает работу вашей программы.

Поэтому, чтобы не было таких коллизий - лучше хранить наборы объектов сразу отдельно - в словарях или списках, а не складывать в глобальные переменные.

→ Ссылка