Повторение материала. Работа с ошибками в Python.
Наш код подразумевает печать содержимого переменной vector.
Запустим написанный скрипт, получим следующий вывод:
$ python3 solution.py Traceback (most recent call last): File "solution.py", line 1, in for coord in vector: NameError: name 'vector' is not defined
Сообщение означает, что при исполнении кода возникла ошибка. При этом Python сообщает нам кое-что ещё. Разберём это сообщение детально.
Чтение Traceback 1
Исходное сообщение нужно мысленно разделить на две части. Первая часть это traceback-сообщение:
Traceback (most recent call last): File "solution.py", line 1, in for coord in vector:
Вторая часть — сообщение о возникшей ошибке:
NameError: name 'vector' is not defined
Разберём первую часть. Traceback в грубом переводе означает «отследить назад». Traceback показывает последовательность/стэк вызовов, которая, в конечном итоге, вызвала ошибку.
Traceback (most recent call last):
является заголовочной. Она сообщает, что в последующих строках будет изложен стэк вызовов (он показан отступами). Обратите внимание на сообщение в скобках, оно указывает на порядок вызовов. В данном случае (он же случай по умолчанию) тот вызов, в котором произошла ошибка, будет в последовательности вызовов указан последним.
Вторая и третья строки:
File "solution.py", line 1, in for coord in vector:
показывают информацию о вызове (в нашем случае он один). Во-первых, здесь есть информация о файле, в котором произошёл вызов («solution.py»), затем указан номер строки, где этот вызов происходит («line 1»), в конце стоит информация о том, откуда произошёл вызов («»). В нашем случае вызов происходит непосредственно из модуля, т.е. не из функции. Наконец, вывод содержит не только номер строки, но и саму строку «for coord in vector:».
Заключительная строка сообщения:
NameError: name 'vector' is not defined
содержит вид (тип) ошибки («NameError»), и после двоеточия содержит подсказку. В данном случае она означает, что имя «vector» не определено.
В самом деле, если взглянуть снова на код, то можно убедиться, что мы нигде не объявили переменную «vector».
Подведём итоги. При попытке запуска мы получили следующий вывод
$ python3 solution.py Traceback (most recent call last): File "solution.py", line 1, in for coord in vector: NameError: name 'vector' is not defined
Он говорит нам о возникновении ошибки. Эта ошибка обнаружилась интерпретатором в первой строке файла «solution.py». Сама ошибка является ошибкой имени и указывает на необъявленное имя — «vector».
Чтение Traceback 2
Оберните код из solution.py в функцию:
1 2 3 4 5
def print_vector(vector): for coord in vector: print(coord) print_vector(5)
Запустим наш код
$ python3 solution.py Traceback (most recent call last): File "solution.py", line 5, in print_vector(5) File "solution.py", line 2, in print_vector for coord in vector: TypeError: 'int' object is not iterable
На этот раз сообщение об ошибке сложнее, однако структура у него та же.
Часть со стеком вызовов увеличилась:
Traceback (most recent call last): File "solution.py", line 5, in print_vector(5) File "solution.py", line 2, in print_vector for coord in vector:
Поскольку «most recent call last», читать будем её сверху вниз.
Вызовов на этот раз два. Первый вызов:
File "solution.py", line 5, in print_vector(5)
Произошел в пятой строке. Судя по строчке кода, это вызов написанной нами функции print_vector(5) с аргументом 5.
Следом за ней второй вызов:
File "solution.py", line 2, in print_vector for coord in vector:
Этот вызов происходит внутри функции print_vector, содержащейся в файле «solution.py». Вызов находится в строке 2.
Сама же ошибка имеет вид:
TypeError: 'int' object is not iterable
Как и в первом примере, сообщение об ошибке содержит её тип и подсказку. В нашем случае произошла ошибка типа. В подсказке же указано, что объект типа int не является итерируемым, т.е. таким объектом, который нельзя использовать в цикле for.
$ python3 solution.py Traceback (most recent call last): File "solution.py", line 5, in print_vector(5) File "solution.py", line 2, in print_vector for coord in vector: TypeError: 'int' object is not iterable
В нашем коде возникла ошибка. Её вызвала последовательность вызовов. Первый вызов произошел непосредственно из модуля — в строке 5 происходит вызов функции print_vector(5). Внутри этой функции ошибка возникла в строчке 2, содержащей проход по циклу. Сообщение об ошибке означает, что итерироваться по объекту типа int нельзя. В нашем случае мы вызвали функцию print_vector от числа (от 5).
Некоторые ошибки с примерами кода
Ошибки в синтаксисе
Наиболее частая ошибка, которая возникает в программах на Python — SyntaxError: когда какое-то утверждение записано не по правилам языка, например:
$ python3 >>> print "hello" File "", line 1 print "hello" ^ SyntaxError: Missing parentheses in call to 'print'. Did you mean print("hello")?
Тот же тип ошибки возникнет, если забыть поставить двоеточие в цикле:
$ python3 >>> for i in range(5) File "", line 1 for i in range(5) ^ SyntaxError: invalid syntax
При неправильном использовании пробелов и табуляций в начале строки возникает IndentationError:
$ python3 >>> for i in range(5): print(i) File "", line 2 print(i) ^ IndentationError: expected an indented block
А теперь посмотрим, что будет, если в первой строке цикла воспользоваться пробелами, а во второй — табуляцией:
$ python3 >>> for i in range(5): print(i) # здесь пробелы print(i**2) # здесь табуляция File "", line 3 print(i**2) ^ TabError: inconsistent use of tabs and spaces in indentation
NameError возникает при обращении к несуществующей переменной:
$ python3 >>> words = "Hello" >>> word Traceback (most recent call last): File "", line 1, in NameError: name 'word' is not defined
Ошибки в логике
Напишем простую программу на деление с остатком и сохраним как sample.py:
n = input() m = input() print(n % m)
$ python3 sample.py 5 3 Traceback (most recent call last): File "sample.py", line 3, in print(n % m) TypeError: not all arguments converted during string formatting
Возникла ошибка TypeError, которая сообщает о неподходящем типе данных. Исправим программу:
n = int(input()) m = int(input()) print(n % m)
запустим на неподходящих данных:
$ python3 sample.py xyz Traceback (most recent call last): File "sample.py", line 1, in n = int(input()) ValueError: invalid literal for int() with base 10: 'xyz'
Возникнет ValueError. Эту ошибку ещё можно воспринимать как использование значения вне области допустимых значений (ОДЗ).
Теперь запустим программу на числовых данных:
$ python3 sample.py 1 0 Traceback (most recent call last): File "sample.py", line 3, in print(n % m) ZeroDivisionError: integer division or modulo by zero
При работе с массивами нередко возникает ошибка IndexError. Она возникает при выходе за пределы массива:
$ python3 >>> L1 = [1, 2, 3] >>> L1[3] Traceback (most recent call last): File "", line 1, in IndexError: list index out of range
Что будет, если вызвать бесконечную рекурсию? Опишем её в программе endless.py
def noend(): print("Hello!") noend() noend()
Через некоторое время после запуска возникнет RecursionError:
Traceback (most recent call last): File "endless.py", line 4, in noend() File "endless.py", line 3, in noend noend() File "endless.py", line 3, in noend noend() File "endless.py", line 3, in noend noend() [Previous line repeated 993 more times] File "endless.py", line 2, in noend print("Hello!") RecursionError: maximum recursion depth exceeded while calling a Python object
Контест №1
Сайт построен с использованием Pelican. За основу оформления взята тема от Smashing Magazine. Исходные тексты программ, приведённые на этом сайте, распространяются под лицензией GPLv3, все остальные материалы сайта распространяются под лицензией CC-BY.
Ошибка Traceback (most recent call last): (Python)
написал код который генерирует рандомные пароли вот собственно сам код:
import random from random import choice from string import ascii_uppercase def test(): cs = random.randint(8,25) symbols = 'abcdefghijklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_' rand = (''.join(choice(symbols) for i in range(cs))) if rand == "testPIN12345": print (rand) else: test() test()
по идеи он должен работать до тех пор пока не сгенерирует рандомный пароль совпадающий со значением в if rand == «testPIN12345»: но вылетает ошибка:
Traceback (most recent call last): File "C:\test\test.py", line 19, in test() File "C:\test\test.py", line 17, in test test() File "C:\test\test.py", line 17, in test test() File "C:\test\test.py", line 17, in test test() [Previous line repeated 1017 more times] File "C:\test\test.py", line 12, in test rand = (''.join(choice(symbols) for i in range(cs))) File "C:\test\test.py", line 12, in rand = (''.join(choice(symbols) for i in range(cs))) File "C:\Users\epicb\AppData\Local\Programs\Python\Python38\lib\random.py", line 288, in choice i = self._randbelow(len(seq)) File "C:\Users\epicb\AppData\Local\Programs\Python\Python38\lib\random.py", line 254, in _randbelow_with_getrandbits k = n.bit_length() # don't use (n-1) here because n can be 1 RecursionError: maximum recursion depth exceeded while calling a Python object
Python Ошибка Traceback (most recent call last): Как исправить?
Нужно написать код который парсит каталог товаров из интернет магазина на примере e-katalog и выгружает в таблицу .csv для дальнейшего импорта в WordPress WooCommerce, но это уже отдельная тема. Пока подключил библиотеки. При запуске кода создается .csv с заголовками, но информации по товарам нет. Код выглядит так:
import requests import csv import time from lxml import html from fake_headers import Headers HEADERS = Headers( browser="chrome", os="win", headers=True ).generate() URL = 'https://www.e-katalog.ru/list/431/' DOMAIN = 'https://www.e-katalog.ru' ALL_DATA = dict() QUEUE_URL = set() def add_to_csv_from_file(product_dict): with open('data.csv', 'a') as csvfile: fieldnames = ["Name", "Price", "Url", "Title"] writer = csv.DictWriter(csvfile, fieldnames=fieldnames, quoting=csv.QUOTE_ALL) writer.writerow(product_dict) def get_data(product_link): product = dict() request = requests.get(product_link, headers=HEADERS) tree = html.fromstring(request.content) product_name = tree.xpath("//h1/text()") product_price = tree.xpath("//div[@class='desc-short-prices'][1]//" "div[@class='desc-big-price ib']//span[1]/text()") product['Url'] = product_link product['Title'] = tree.findtext('.//title') for name in product_name: product['Name'] = name for price in product_price: product['Price'] = price time.sleep(3) print('Сбор данных с URL', product_link) return product def get_links(page_url): pagination_pages = set() request = requests.get(page_url, headers=HEADERS) tree = html.fromstring(request.content) pages_count = tree.xpath('//div[@class="ib page-num"]//a[last()]/text()') print('\nКод ответа корневого УРЛ:', request.status_code) print('Всего страниц пейджинации:', pages_count) for url in range(int(pages_count[0])): full_url = f"https://www.e-katalog.ru/list/431//" pagination_pages.add(full_url) while len(pagination_pages) != 0: current_url = pagination_pages.pop() print('Сбор ссылок с URL:', current_url) request = requests.get(current_url, headers=HEADERS) tree = html.fromstring(request.content) links = tree.xpath("//a[@class='model-short-title no-u']/@href") for link in links: QUEUE_URL.add(DOMAIN+link) time.sleep(3) def main(): with open('data.csv', 'a') as csvfile: fieldnames = ["Name", "Price", "Url", "Title"] writer = csv.DictWriter(csvfile, fieldnames=fieldnames, quoting=csv.QUOTE_ALL) writer.writeheader() get_links(URL) while len(QUEUE_URL) != 0: current_url = QUEUE_URL.pop() add_to_csv_from_file(get_data(current_url)) if __name__ == "__main__": main()
Так выглядит ошибка
- Вопрос задан 09 нояб. 2022
- 1228 просмотров
Traceback (most recent call last)
Доброго времени суток!
Выдает : Traceback (most recent call last):
File «main.py», line 23, in
tr.setup(Dx, Dy, 200, 200)
File «», line 6, in setup
File «/usr/lib/python3.8/turtle.py», line 3663, in Screen
Turtle._screen = _Screen()
File «/usr/lib/python3.8/turtle.py», line 3679, in __init__
_Screen._root = self._root = _Root()
File «/usr/lib/python3.8/turtle.py», line 435, in __init__
TK.Tk.__init__(self)
File «/usr/lib/python3.8/tkinter/__init__.py», line 2270, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: couldn’t connect to display «:1»
Не понимаю, что не так. Помогите , пожалуйста исправить. Заранее спасибо!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
-*- utf-8 -*- import turtle as tr from random import uniform # def fun2_2(x,y,a,b): if (x -1) or (x > 4): flag = 0 #False if (((x0) and (x>=-a) and (y0) and (y>=-b) and (x**2 +y**2 r**2) ) or ((x>=0) and (xa) and (y>=0) and (yb) and (x**2+y**2>r**2))): flag = 1 else: flag = 0 return(flag) # Инициализация turtle # *************************************** # Границы графика aX = [-2, 5] # левая и правая aY = [-2, 11] # нижняя и верхняя Dx = 300 Dy = Dx/((aX[1] - aX[0])/(aY[1] - aY[0])) tr.setup(Dx, Dy, 200, 200) tr.reset() # число точек рисования Nmax = 10000 # # Установка мировой системы координат tr.setworldcoordinates(aX[0], aY[0], aX[1], aY[1]) # tr.title("Lab_8_2_2") # заголовок tr.width(2) # толщина линии tr.ht() # невидимая tr.tracer(0,0) # 0 - задержка между обновлениями # *************************************** # # рисование функции tr.up() mfun = 0 # точек попало в # заштрихованную область for n in range(Nmax): # генерируем координаты точки x = uniform(aX[0],aX[1]) y = uniform(aY[0],aY[1]) tr.goto(x,y) if fun2_2(x,y) != 0: # попала tr.dot(3,"green") mfun += 1 # else: # не попала # tr.dot(3, "#ffccff") # tr.color("blue", "blue") # цвет и заливка # # Рисуем оси # Ось X tr.up() tr.goto(aX[0], 0) tr.down() tr.goto(aX[1], 0) # Ось Y tr.up() tr.goto(0, aY[1]) tr.down() tr.goto(0, aY[0]) # # координатные метки # и надписи на оси X tr.up() for x in range(aX[0], aX[1]): tr.goto(x, 0.1) tr.down() tr.goto(x, 0) tr.up() tr.sety(-0.4) coords = str(x) tr.write(coords) # # на оси Y for y in range(aY[0], aY[1]): tr.goto(0, y) tr.down() tr.goto(0.1, y) tr.up() tr.setx(0.2) coords = str(y) tr.write(coords) # # Рисуем стрелки # на оси X poli = [0, 0.1, 0, -0.1, 0] Arrbeg = int(aX[1]) Xpoli = [Arrbeg, Arrbeg - 0.1, Arrbeg+0.3, Arrbeg - 0.1, Arrbeg] tr.goto(Xpoli[0],poli[0]) tr.begin_fill() tr.down() for i in range(1,5): tr.goto(Xpoli[i], poli[i]) tr.end_fill() # заливаем стрелку # Надпишем ось X tr.up() tr.goto(Arrbeg, -0.7) tr.write("X", font=("Arial",14,"bold")) # # на оси Y Arrbeg = int(aY[1]) Ypoli = [Arrbeg, Arrbeg - 0.1, Arrbeg + 0.3, Arrbeg - 0.1, Arrbeg] tr.up() tr.goto(poli[0], Ypoli[0]) tr.begin_fill() tr.down() for i in range(1,5): tr.goto(poli[i],Ypoli[i]) tr.end_fill() # Надпишем ось Y tr.up() tr.goto(0.2, Arrbeg) tr.write("Y", font=("Arial",14,"bold")) Sf = (aX[1] - aX[0]) * (aY[1] - aY[0]) * mfun/Nmax tr.goto(1, 9) fstr = "N = \nNf = \nSf = " meseg = fstr.format(Nmax, mfun, Sf) tr.write(meseg, font=("Arial",12,"bold")) print(meseg) # Комментировать при работе в IDLE # tr.done() # tr.mainloop()