почему мои ошибки появляются первыми, а операторы print идут вторыми в python? - PullRequest
1 голос
/ 16 апреля 2020

Я написал несколько классов: корзина покупок, клиент, заказ и некоторые функции для скидок на заказы. это последние строки моего кода.

anu = Customer('anu', 4500)  # 1
user_cart = [Lineitem('apple', 7, 7), Lineitem('orange', 5, 6)]  # 2
order1 = Order(anu, user_cart)  # 2
print(type(joe))  # 4
print(order1) # 5

format()  # 6

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

Traceback (most recent call last):
  File "C:\Users\User\PyCharm Community Edition with Anaconda plugin 2019.3.1\plugins\python-ce\helpers\pydev\pydevd.py", line 1434, in _exec
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Users\User\PyCharm Community Edition with Anaconda plugin 2019.3.1\plugins\python-ce\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "D:/programming/python/progs/my_programs/abc_module/abstract_classes.py", line 97, in <module>
    format()
TypeError: format expected at least 1 argument, got 0
<class '__main__.Customer'>

Congratulations! your order was successfully processed.

Customer name: anu
Fidelity points: 4500 points

Order  :-
    product count: 2
        product        : apple
        amount         : 7 apple(s)
        price per unit : 7$ per 1 apple
        total price    : 49$


        product        : orange
        amount         : 5 orange(s)
        price per unit : 6$ per 1 orange
        total price    : 30$


subtotal        : 79$
promotion       : Fidelity Deal
discount amount : 24.88$
total           : 54.115$

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Это происходит потому, что stdout буферизуется, а stderr - из-за производительности. Это означает, что может быть задержка, когда вы пишете что-то в stdout (print инструкция), но не когда пишется ошибка в stderr, поэтому запись stdout происходит после stderr.

См. this для более подробной информации.

Если вы не хотите, чтобы это происходило, используйте:

python -u myscript.py

при вызове вашего скрипта. Это приводит к отключению буферизации stdout.

РЕДАКТИРОВАТЬ: я вижу, что вы работаете на интерпретаторе pycharm, в этом случае вы можете использовать параметр -u для интерпретатора python, добавив -u аргумент в поле run configuration> interpreter options.

1 голос
/ 16 апреля 2020

Если я угадаю правильно, ваш главный вопрос о том, почему часть кода запускается до того, как обнаружена ошибка? Это связано с тем, что Python - это интерпретируемый язык .

Кроме чисто синтаксических ошибок, которые обнаруживаются при загрузке файла, все ошибки обнаруживаются, когда интерпретатор Python выполняет операторы. .

Это означает, что программа будет работать до тех пор, пока в ней не будет действительной ошибки, поэтому будет выполняться код, который выполняет инициализацию и печать, потому что в ней нет ошибок. Затем интерпретатор Python обнаружит ошибку, которую format не имеет никаких аргументов, и сообщит об этой ошибке.


Что касается того, почему ошибки печатаются первыми, а ваша программа выводится позже, это потому, что ошибки и нормальный вывод записываются в разные «файлы». Ошибки записываются в «стандартную ошибку» (stderr), а нормальный вывод записывается в «стандартный вывод» (stdout).

Ваша среда IDE перехватывает вывод в stderr и stdout для различных внутренних буферы, и, кажется, просто записывает вывод в stderr, прежде чем записывает вывод в stdout.

...