python3: почему python изменяет порядок моих отпечатков и, похоже, забывает параметры функции, которые позже появляются снова?

#python #python-3.x #arguments #keyword-argument #default-arguments

#python #python-3.x #аргументы #ключевое слово-аргумент #по умолчанию-аргументы

Вопрос:

Я хотел иметь небольшую функцию, которая печатает сообщение об ошибке, а затем завершает работу программы. Когда я изменил метод завершения программы с sys.exit() на raise RuntimeError() , внезапно мое сообщение перестало печататься. Затем я некоторое время отлаживал метод, но я не понимаю, почему порядок отпечатков инвертирован и почему python считает, что мои *args отпечатки пусты.

Мой код:

 def original_fail(retcode=1, *args, **kwargs):
    print(*args, **kwargs) # the actual site of the print
    raise RuntimeError() # no printing, only raises method

def debug_fail(retcode=1, *args, **kwargs):
    print("called")
    print("args=", args, "kwargs=", kwargs)
    print(*args, **kwargs) # the actual site of the print
    print("printed")
    #raise RuntimeError()
    print("before termination")
    exit(retcode)
    print("after termination")

debug_fail("outside message")
 

и он печатает

 $ python3 /tmp/soverflow.py
called
args= () kwargs= {}

printed
before termination
outside message
 

Что меня особенно раздражает, так это то, что python считает args и kwargs пустым, и, следовательно, также печатает пустую строку, но все равно в самом конце печатает outside message .
Когда я не ввожу retcode=1 функцию, она работает, но я хочу иметь этот параметр.
РЕДАКТИРОВАТЬ: по-видимому, поведение происходит от retcode становления "outside message" , но это не то, чего я хочу. Я хочу, чтобы все аргументы передавались для печати, кроме ключевого аргумента retcode , который я хочу отфильтровать. Как мне это сделать?

Я использую python 3.8.6 на компьютере Fedora 32:

 sh-5.0$ python3 --version
Python 3.8.6
sh-5.0$ uname -a
Linux workstation-fedora 5.9.10-100.fc32.x86_64 #1 SMP Mon Nov 23 18:12:36 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
 

Я хочу понять это поведение и что нужно сделать, чтобы на самом деле использовать raise RuntimeError() в моей реализации

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

1. Ваш аргумент станет retcode , поскольку он первый.

2. Ahhh, exit() по-видимому, можно взять строку и распечатать ее (я ожидал, что она выдаст). Что мне сделать, чтобы распечатать все аргументы, отфильтровать аргумент retcode и передать только его?