Ошибка строкового аргумента с командами словаря - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь создать базовый c интернет-магазин в python. Но всякий раз, когда я пытаюсь «купить» элемент, он показывает ошибку в моем словаре или что-то, в чем я не уверен.

Ошибка: users [n] ["Transactions"] = users [n] ["уже купили "] + str (names_f," купленный ", quanti," из ", окончательный [выбор * 3]," с общей ценой $ "+ цена) TypeError: str () принимает не более 3 аргументов (дано 6)

    coun = 0

    users = [{"name":"Jack","username":"ja", "cc":'12345',"email":'whwhwwhh', "code": '111', "Transactions": ""}]

    def sign_in():
    username = input("Enter username")
    for i in range (len(users)):
            for x in users[i].values():
                if x == username:
                    pin = input("Enter pin")
                    if pin == users[i].get("code"):
                        print("Welcome", users[i].get("name"))
                        menu(username,users[i].get("name"))
                        break
                else:
                     print("Wrong pin")
                     sign_in()

     def menu (usern, names_f):
     global coun
     if coun == 0:
     order = ''
     total = 0
     for i in range (len(categories)):
            print(str(i+1)+".", categories[i])
            choice = int(input("Choose a category by typing the number beside the categories name."))-1
            print("Items in this list are")
            print("Itemname \t Price \t Stock")
            final = location[choice]
            for c in range((int(len(final)/3))):
                print(str(c+1)+'.',str(final[c*3]),"\t",'$'+str(final[c*3+1])), "\t", str(final[(c*3)+2])
            choice = int(input("Which item (Type number on left of the item name)"))-1
            while True:
                quanti = int(input("How many do you want to buy"))
                if quanti > final[choice*3+2]:
                    print("Sorry your request for", quanti, "Is more than we have at the store please try again")
                    continue
                else:
                    price = str(quanti*final[choice*3+1])
                    final[choice*3+2] = final[choice*3+2]-quanti
                    print("Thank you for your purchasing",quanti,"of", final[choice*3], "Your total price of this buy is", '$'+price)
                    for n in range (len(users)):
                        if usern == users[n].get("username"):
                            users[n]["Transactions"] = users[n]["Transactions"] + str(names_f, "bought", quanti, "of", final[choice*3], "with a total price of $"+price)
                            order += str(quanti, 'of', final[choice*3])
                            price += int(price)
                        done = input("Do you want to check out then type '1' if you want to continue type '2'")
                        if done == '1':
                            print("Thank you")
                            print ("Invoice:", order, "/n total price (HKD) $"+str(price))
                        else:
                            coun += 1
                            menu(usern,names_f)   

Ответы [ 2 ]

0 голосов
/ 02 февраля 2020

str является классом, и, как указано в документах , вы можете передать ему до 3 параметров:

class str(object=b'', encoding='utf-8', errors='strict')

Кроме того, он также говорит, что делает:

Возвращает строковую версию объекта. Если объект не указан, возвращает пустую строку.

Это означает, что он используется для приведения других типов к строке. Таким образом, вам нужно преобразовать каждый int индивидуально:

users[n]["Transactions"] = users[n]["Transactions"] + str(names_f) + " bought " + str(quanti) + " of " + str(final[choice*3]) + " with a total price of " + str(price)

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

users[n]["Transactions"] = users[n]["Transactions"] + '%s bought %s of %s with a total price of %s' % (names_f, quanti, final[choice*3], price)

В качестве примечания стоит проверить, что происходит при выполнении первой транзакции. Если ключ Transactions еще не существует, вам нужно добавить начальное значение перед тем, как получить к нему доступ.

Обычно я делаю это следующим образом:

if key not in dict_:
  dict_[key] = 'my initial value'

dict_[key] += 'add my stuff'

другое решение будет использовать * Метод 1026 *, который позволяет добавить значение по умолчанию:

dict_.get(key, 'default')

Обратите внимание, что это не добавит ключ в словарь, а это означает, что попытка доступа к его значению в дальнейшем все равно приведет к ошибке ключа .

0 голосов
/ 02 февраля 2020
variable_name = users[n]["Transactions"] + str(names_f) + "bought" + str(quanti) + "of" + str(final[choice*3]) + "with a total price of $"+ str(price)
users[n]["Transactions"] = variable_name

Возможно, вам потребуется где-то объявить переменную_имя. Проблема в том, что использование str следует за str (объект, кодировка = кодировка, ошибки = ошибки), но всякий раз, когда вы передаете запятую, оно считается другим параметром. PS Я не уверен, что вам нужны все эти строки в моем решении.

...