Python 'int' объект не является подписным - PullRequest
0 голосов
/ 31 октября 2011

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

fileName = input("What file name? ")
infile = open(fileName,'r')
correct_order_flag = False
i = 0
line = infile.readline()
while line !="": 
    for xStr in line.split(" "):
        if eval(xStr) [i] < i:
            correct_order_flag = True
        else:
            correct_order_flag = False
    i = i+1
if correct_order_flag:
    print("Yes, the numbers were in order")
else:
    print("No, the numbers were not in order")
count = i - 1
print("There were", count, "numbers.")

Ответы [ 4 ]

4 голосов
/ 31 октября 2011

Вы правы - с помощью eval(xStr)[i] вы указываете, что eval(xStr) является массивом, и поэтому может быть подписан. Выглядит так, как будто вы хотите (поскольку вы говорите, что хотите преобразовать строку в целое число), это просто int(xStr), чтобы получить всю эту строку:

if int(xStr) < i:
1 голос
/ 31 октября 2011

Для начала, вы вообще не читаете весь файл.Попробуйте это:

with open(fileName) as f:
    for line in f:
        # here goes your code

Не уверен, однако, что вы подразумеваете под "каждое значение в порядке", но использование eval() является ОЧЕНЬ плохой идеей для любой цели.

0 голосов
/ 31 октября 2011

Как указал Крис, int (s) является предпочтительным способом преобразования строки в целое число.eval (s) слишком широка и может представлять угрозу безопасности при оценке данных из ненадежного источника.

Кроме того, в скрипте есть еще одна ошибка.* Correct_order_flag * устанавливается на каждой итерации, поэтому одна запись с неправильным порядком может быть замаскирована последующей записью в правильном порядке.Соответственно, вы должны выйти из цикла при обнаружении неправильного порядка.

0 голосов
/ 31 октября 2011

Я хотел бы добавить, что, поскольку вы сравниваете xstr [i] с i, если ваш первый номер меньше нуля, флаг изменится, означая, что последовательность 1 2 3 4 5 выведет сообщение «НЕТ,номера были не в порядке "

...