#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
и передать только его?