Функции переноса Python3

#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           
##############################