Объект 'str' не имеет атрибута 'get' при попытке проверить, существует ли строка в словаре - PullRequest
1 голос
/ 16 июня 2020

У меня есть три словаря, каждый из которых «инвентарь», как в видеоигре.

playerInventory = {"arrow": 12, "gold coin": 42, "rope": 1, "torch": 6, "dagger": 1}
inv = {'gold coin': 42, 'rope': 1}
dragonLoot2 = {"gold coin": 3, "dagger": 1, "ruby": 1}

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

def checkItem(inventory, item):
    print("You have " + str(inventory.get(item, 0)) + " of " + str(item))

kolla_item = input("Item to check: ")
kolla_inventory = input("Inventory to check: ")

checkItem(kolla_inventory, kolla_item)

Это дает мне ошибку 'str' object has no attribute 'get 'для определения checkItem. Я попытался удалить str и удалить круглые скобки вокруг команды, чтобы получить номер указанного элемента, который у вас есть, но ничего не работает, я все еще получаю эту ошибку. Однако я заметил, что если я ввожу элемент вручную как строку и словарь, как показано ниже, он работает отлично

checkItem(dragonLoot2, "ruby")

Так по какой-то причине ввод элемента не является строкой при вводе? Если ввести str( вокруг подсказки ввода kolla_item, это тоже не исправит.

Ответы [ 3 ]

2 голосов
/ 16 июня 2020

Похоже, проблема в том, что вы пытаетесь ввести строку от пользователя и проверить, соответствует ли эта строка имени словаря.

например, "dragonLoot2" не равно dragonLoot2, так как один - это строка, а другой - имя переменной.

Для этого вам нужно будет создать условия:

playerInventory = {"arrow": 12, "gold coin": 42, "rope": 1, "torch": 6, "dagger": 1}
inv = {'gold coin': 42, 'rope': 1}
dragonLoot2 = {"gold coin": 3, "dagger": 1, "ruby": 1}

def checkItem(inventory, item):
    print("You have " + str(inventory.get(item, 0)) + " of " + str(item))

kolla_item = input("Item to check: ")
kolla_inventory = input("Inventory to check: ")

if kolla_inventory == "dragonLoot2":
    checkItem(dragonLoot2, kolla_item)
elif kolla_inventory == "inv":
    checkItem(inv, kolla_item)
elif kolla_inventory == "playerInventory":
    checkItem(playerInventory, kolla_item)
1 голос
/ 16 июня 2020

Как уже указывалось, это вопрос типа аргумента. У вашей функции есть подпись:

def checkItem(inventory:dict, item:str):

Итак, инвентарь должен быть dict. Всякий раз, когда вы запрашиваете ввод данных пользователем, python по умолчанию возвращает строку. Строки не имеют метода get. То, что вы хотели сделать, больше походило на переключатель. Примерно так:

def select_dict(dictionary_name):
    if dictionary_name == 'playerInventory'
        return playerInventory
1 голос
/ 16 июня 2020

Если вы запустите это и введете золотую «монету», а затем "playerInventory,", вы также запустите функцию checkItem, где inventory будет "playInventory". Затем в функции вы пишете inventory.get, что по сути является "playerInventory".get(), которое вы не можете использовать, потому что .get() применяется только для словарей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...