Ошибка типа: объект ‘float’ не подлежит подписке при попытке создать подстроку

#python

Вопрос:

Итак, у меня есть этот код:

 # Imports
import sys
import random

# Data Collection
UserID = int(sys.argv[1])
KeyA = int(sys.argv[2])
PI = 3.14159265359

# Calculation
PIUserID = UserID * PI
PIKeyA = KeyA * PI
PIKeyB = PIKeyA   4

CalcUserID = PIUserID / 9
CalcUserID2 = PIUserID - PIKeyA
CalcKeys = (PIKeyA   CalcUserID2) / (((PIKeyB - PIKeyA) * 2)   1)

MidCalcKeyBC = str(PIKeyB / PI)

ResultUserID = UserID
ResultKeyA = KeyA
ResultKeyB = MidCalcKeyBC.split('.')[0]
ResultKeyC = MidCalcKeyBC.split('.')[1]

# Finish!
print("User ID: "   str(ResultUserID))
print("Key A: "   str(ResultKeyA))
print("Key B: "   str(ResultKeyB))
print("Key C: "   str(ResultKeyC))
print("Calc Keys: "   str(CalcKeys))
print("")
StrCalcKeys = str(CalcKeys)
StrCalcUserID = str(CalcUserID)
print("Success: "   str(CalcKeys[:len(StrCalcKeys) - 1]) == str(CalcUserID[:len(StrCalcUserID) - 1]))
 

Предполагается, что он вычисляет ключ и ключ, просто получая идентификатор пользователя и ключ.

И когда я запускаю его так: python CalculateLogin.py 12 376 я получаю ошибку:

 Traceback (most recent call last):
  File "f:/Unity/Projects/Project Astra/Assets/Scripts/createCredentials.py", line 35, in <module>
    print("Success: "   str(CalcKeys[:len(StrCalcKeys) - 1]) == str(CalcUserID[:len(StrCalcUserID) - 1]))
TypeError: 'float' object is not subscriptable
 

как раз тогда, когда это должно быть сказано Success: True .

Комментарии:

1. Что вы собираетесь CalcKeys[:len(StrCalcKeys) - 1] делать?

2. Вы имели в виду: str(StrCalcKeys[:len(StrCalcKeys) - 1]) ?

3. @quamrana StrCalcKeys -это уже строка, хотя

4. CalcKeys и CalcUserID оба числа не str являются .

5. Своими словами, как вы думаете, что означает сообщение об ошибке? Как вы думаете, какая часть этой строки кода вызывает проблему? Теперь посмотрите на это внимательно. Используете ли вы переменные, которые собираетесь использовать? (Подсказка: почему у вашей программы есть отдельные CalcKeys и StrCalcKeys значения? Какой из них содержит строку? Вы пытаетесь использовать строку в этом коде?)

Ответ №1:

Похоже, вы злоупотребляете этой str() функцией, чтобы печатать вещи

Например, вы должны предпочесть любой из этих

 print("User ID: {}".format(ResultUserID))
print(f"User ID: {ResultUserID}")
 

Тогда в вашей строке успеха CalcKeys и CalcUserID находятся поплавки. Предполагая , что они были строками , и вы имели в виду str(CalcKeys)[:len(StrCalcKeys) - 1] , что [:len(s) - 1] это точно то же самое, что и вся строка для любой строки s , так что, похоже, вы хотели сравнить только значения, которые не обязательно должны быть строками

 print("Success: {}".format(CalcKeys == CalcUserID))
 

Комментарии:

1. Хотя это полностью то, что мне было нужно, я хочу удалить последнюю цифру из — за странности калькулятора, и именно поэтому у меня есть «СТРОКА»[:len(s) — 1]

2. Вам нужно будет вычесть 2, чтобы удалить последний символ. Что вы имеете в виду под «странностями калькулятора»? Если вы имеете в виду арифметику с плавающей запятой, то вы можете использовать round значения с определенной десятичной запятой перед сравнением или с format плавающей запятой, чтобы сделать то же самое при печати