Найти - Пользователи
Полная версия: Помогите исправить ошибку TypeError: must be str, not int
Начало » Python для новичков » Помогите исправить ошибку TypeError: must be str, not int
1 2
shshgyva1123s
запускаю ошибка

File “Main.py”, line 123, in <module>
key = Key.from_int(random.randint(a,b))
File “C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\random.py”, line 221, in randint
return self.randrange(a, b+1)
TypeError: must be str, not int
Для продолжения нажмите любую клавишу . . .


Ругается на строчку в коде,123 строка
  key = Key.from_int(random.randint(a,b))

В скрипте были переменные вот так и все работало
a = 10000
b = 99999

добавил в код
#a1 = open(“1.txt”, “r”).read()
#b1 = open(“2.txt”, “r”).read()

чтобы значение бралось из txt файла и изменил
a = a1
b = b1

и после этого появилась ошибка на 123 строке.

Возможно исправить это? и как? сильно не пинайте пожалуйста






m1r42
shshgyva1123s
TypeError: must be str, not int
должен быть str, а не int

т.е. переменные a и b должны быть строками с самого начала
 a = "10000"
b = "99999"

Это если в дальнейшем им присваивать строковое значение.

затем при расчетах можно сделать их int(a) + int(b) если надо, но это бредово. Надо изначально логику по другому построить.

randint(a,b) же сама за себя говорит, что ей надо int
а вы ей суете сроки
a1 = open(“1.txt”, “r”).read()
b1 = open(“2.txt”, “r”).read()
a = a1
b = b1

xam1816
shshgyva1123s
добавил в код
#a1 = open(“1.txt”, “r”).read()
#b1 = open(“2.txt”, “r”).read()

чтобы значение бралось из txt файла и изменил
a = a1
b = b1

и после этого появилась ошибка на 123 строке.
все что читается из файла - это строка.
randint принимает на вход значение типа int

  
import random
 
with (open('1.txt', 'r') as f1,
      open('2.txt', 'r') as f2):
 
    a = int(f1.read())
    b = int(f2.read())
 
rand_num = random.randint(a, b)
 
print(rand_num)

[code python]между этими тегами вставлять код[/code]
py.user.next
shshgyva1123s
  
File "C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\random.py", line 221, in randint
return self.randrange(a, b+1)
TypeError: must be str, not int
Это баг питона
  
>>> import random
>>> 
>>> random.randint('1', '2')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python3.6/random.py", line 221, in randint
    return self.randrange(a, b+1)
TypeError: must be str, not int
>>> 
>>> random.randint(1, 2)
2
>>>
Он должен писать
  
TypeError: must be int, not str
Можно запостить этот баг https://github.com/python/cpython/issues , чтобы его исправили.

Ты в random.randint() передал не целые числа, а строки. Из файла целые числа в текстовом режиме не читаются, поэтому после прочтения “чисел” из файла нужно перевести их в целочисленный тип.
ZerG
Он должен писать
Так он и пишет
Да и описание тоже самое говорит
Просто нужно редактор использовать нормальный
py.user.next
ZerG
Так он и пишет
Python 3.10.0a0
  
>>> import random
>>> 
>>> random.randint('1', '2')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/mnt/.../cpython/Lib/random.py", line 338, in randint
    return self.randrange(a, b+1)
TypeError: can only concatenate str (not "int") to str
>>>
Пишет какую-то ерунду невнятную.

ZerG
Просто нужно редактор использовать нормальный
Ошибка в библиотечном модуле random.
m1r42
py.user.next
TypeError: can only concatenate str (not “int”) to str
Я думаю, что перед запуском randrange выполняется операция сложения b+1, а так как b это строка в конкретно этом случае то правильно и пишет, можно конкатенировать только строку (не число)
Вот этот кусок модуля random.py
    def randint(self, a, b):
        """Return random integer in range [a, b], including both end points.
        """
        return self.randrange(a, b+1)
 >>> '1'+1
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    '1'+1
TypeError: can only concatenate str (not "int") to str
>>> 
randint же не предполагает что ему подсунут строку
Только для эксперимента исправил модуль random для ленивых
     def randint(self, a, b):
        """Return random integer in range [a, b], including both end points.
        """
        return self.randrange(int(a), int(b)+1)
и, о чудо теперь можно не заморачиваться с типами str и int
 >>> import random
>>> random.randint('1','2')
2
>>> 
, но это только ради шутки
ZerG
  >>> import random
>>> random.randint('1.0','2.0')
>>> ?
m1r42
ZerG
>>> import random
>>> random.randint('1.0','2.0')
>>> ?
Смешно . Я написал, что ради шутки.
 >>> int('1.0')
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    int('1.0')
ValueError: invalid literal for int() with base 10: '1.0'
>>> 
При желании можно добавить и float('1.0')
Что-то вроде этого: (хотя код некрасивый до жути, тороплюсь, надо валить домой)
 try:
    int('1.0')
    a = 1
except Exception as e:
    print(e)
    a = 0
if a == 0:
    try:
        b = float('1.0')
        print(b)
    except Exception as e:
        print(e)
elif a == 1:
    print(a)
py.user.next
m1r42
и, о чудо теперь можно не заморачиваться с типами str и int
Это всё, конечно, интересно, но там весь модуль random надо пересматривать, потому что это не единственный подобный баг в нём. Когда он писался, то время прошло уже давно, а ошибки старые остались, которые для современного питона смотрятся как-то сопливо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB