#python #function #error-handling #wrapper
#python #функция #обработка ошибок #обертка
Вопрос:
Я нигде не смог найти решения своих вопросов, поэтому, возможно, я смогу получить ответ на это здесь. В основном я пытался напечатать кортеж с помощью другой функции, а затем попытался обернуть этот вывод в другой. Если я перенесу текст в сторону функции wrapped_string_linesplit(), она работает отлично, но я в принципе не хочу, чтобы это было так. Может быть, кто-нибудь может объяснить, в чем мои ошибки, и что было бы хорошим решением перенести это из другой функции. Заранее спасибо
Рабочее решение:
def wrapped_string_linesplit(arg):
print('#' * 30)
for item in arg:
print(item)
print('#' * 30)
def welcome_message():
first = 'Welcome to xyz'.center(30, ' ')
second = ('#' * 30).center(30, ' ')
third = 'New Game'.center(30, ' ')
fourth = 'Load Game'.center(30, ' ')
fifth = 'About'.center(30, ' ')
sixth = 'Quit Game'.center(30, ' ')
return first, second, third, fourth, fifth, sixth
wrapped_string_linesplit(welcome_message())
Вывод:
##############################
Welcome to xyz
##############################
New Game
Load Game
About
Quit Game
##############################
Затем изменение кода на следующий вообще не выводит перенос без ошибки:
def message_wrapper(foo):
def wrap():
print('#' * 30)
foo()
print('#' * 30)
return wrap
def string_linesplit(arg):
for item in arg:
print(item)
message_wrapper(string_linesplit(welcome_message()))
Вывод:
Welcome to xyz
##############################
New Game
Load Game
About
Quit Game
##############################
Следующий, который я вообще не понимаю, выдает ошибку
foo()
Ошибка типа: объект ‘NoneType’ не вызывается
при вызове foo() внутри message_wrapper().
Почему он должен иметь возвращаемое значение, чтобы его можно было вызвать из другой функции?
def message_wrapper(foo):
print('#' * 30)
foo()
print('#' * 30)
def string_linesplit(arg):
for item in arg:
print(item)
message_wrapper(string_linesplit(welcome_message()))
Комментарии:
1. в вашем коде нет метода с именем
foo()
. вы объявилиfoo
как переменную вmessage_wrapper
функции.foo
это переменная, которую вы не можете вызвать переменная2. В последнем фрагменте кода
string_linesplit
ничего не возвращает (None), следовательно,foo
равно none, и это приводит к ошибке:NoneType object is not callable
. Я думаю, что вы немного усложняете это3. большое спасибо, теперь все ясно. Оба ответа приводят к возможному решению. Не уверен, что все еще усложняет это.
Ответ №1:
Меня смущает данный фрагмент кода, но если мне придется работать с данным фрагментом кода и выдавать выходные данные, как указано выше:
def welcome_message():
first = 'Welcome to xyz'.center(30, ' ')
second = ('#' * 30).center(30, ' ')
third = 'New Game'.center(30, ' ')
fourth = 'Load Game'.center(30, ' ')
fifth = 'About'.center(30, ' ')
sixth = 'Quit Game'.center(30, ' ')
return first, second, third, fourth, fifth, sixth
def string_linesplit(arg):
for item in arg:
print(item)
def message_wrapper(foo):
print('#' * 30)
string_linesplit(foo())
print('#' * 30)
message_wrapper(welcome_message)
Вывод:
##############################
Welcome to xyz
##############################
New Game
Load Game
About
Quit Game
##############################