VK API. Python. Как создать индивидуальную переменную для каждого пользователя с помощью словаря?
Я познакомился с основами Python. Решив применить знания на практике, я начал постепенно создавать простого бота для ВК с использованием VK API. Попрошу без нравоучений в роде "тебе не стоит пока сюда лезть, занимайся основами" или "сначала изучи все о API, потом что-то делай".
К сути дела: Я хочу сделать одну единственную переменную для каждого пользователя - количество поинтов. На просторах интернета предлагают использовать базы данных, но не хочу с ними связываться из-за одной переменной. Я читал, что это возможно сделать с помощью словаря (ключ, значение). Хотелось бы, чтобы словарь был вида {ID: points}. Звучит достаточно просто. Как такового примера я не нашел ни тут, ни в YouTube.
Прочитал на этом форуме предложение использовать dict.get, я попытался, но этот метод напрочь отказывается записывать ID пользователя в качестве ключа. Когда я попробовал в консоли узнать тип: print(type(points)), выдало ошибку "NameError: name 'points' is not defined". Если таким образом попытаться узнать тип любой переменной, например x, выдаст такую же ошибку. Несколько часов я лазил в интернете на различных форумах, и не нашел ответа.
При запуске кода, я пишу боту команду "/point" и консоль выводит ошибку "KeyError: (мой ID в вк)". То есть строка points.get(from_id, 0) не записывает ID пользователя в словарь и следующая строка его, соответственно, не находит.
Господа айтишники, как всё-таки достичь цели? Подчеркну ещё раз, я не вижу смысла заморачиваться с MySQL и прочими базами ради одной переменной. Создаю я этого бота больше для практики, поковыряться, ради интереса. Попрошу не критиковать.
import vk_api
from vk_api.utils import get_random_id
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
import random
session = vk_api.VkApi(token = 'не дам')
vk = session.get_api()
VkBotLongPoll = VkBotLongPoll(session, group_id=не дам)
def write_message(sender, message):
session.method('messages.send', {'chat_id': sender, 'message': message, 'random_id': get_random_id()})
def get_name(from_id):
sender_info = vk.users.get(user_ids = from_id)[0]
full_name = sender_info.get('first_name') + ' ' + sender_info['last_name']
return full_name
points = {}
for event in VkBotLongPoll.listen():
if event.type == VkBotEventType.MESSAGE_NEW and event.from_chat and event.message.get('text') !='':
msg = event.message.get('text').lower()
sender = event.chat_id
from_id = event.message.get('from_id')
name = get_name(from_id)
if msg == '/point':
x = random.randint(1, 10)
points.get(from_id, 0)
points[from_id] += x
write_message(sender, name + ', ' + f'you have earned {x} points')
Ответы (1 шт):
Когда я попробовал в консоли узнать тип: print(type(points)), выдало ошибку "NameError: name 'points' is not defined".
Подозреваю, что функция type() вызывалась в Python Console в IDE, соответственно, в консоли переменные были не инициализированы , это и приводило к исключению. Если вызвать print(type(points)) в теле кода, либо же в режиме дебаггера - она должна вернуть <class 'dict'> , т.к в коде переменная points инициализирована как пустой словарь.
строка points.get(from_id, 0) не записывает ID пользователя в словарь и следующая строка его, соответственно, не находит.
Метод словаря get() не перезаписывает значение в существующем словаре, а лишь только возвращает значение по переданному ключу в качестве аргумента.
Таким образом строка points[from_id] += x вызовет эксепшн KeyError (если бы она была с = , вместо += - тогда бы создала новый ключ с id from_id)
В данном случае, не совсем понятна структура словаря. Зачем делать ключ fromId в словаре points? Если уж это должна быть импровизированная БД ) Скорее, здесь будет смысл считать переменную points как название таблицы (словаря с таблицей), а внутри хранить значения в виде ключ (id юзера) и значение (кол-во очков юзера).
Таким образом:
points = {}
points[999] = 1
print(points[999])
Я присвоил юзеру с id 999 значение 1.
Вы же , сначала берете несуществующее значение (думая что оно туда запишется), далее points.get(from_id, 0) из словаря, при этом еще используя += делаете это: points[from_id] += x
(то ли присвоить, то ли хотите инкрементировать значение по несуществующему ключу - не понял).
Попрошу без нравоучений в роде "тебе не стоит пока сюда лезть, занимайся основами"
Так что здесь сложно без этого, вам действительно стоит сначала разобраться с основами, и тогда вам будет проще. Удачи в начинаниях! :)