1. Python / Говнокод #27351

    +3

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    """
    A module for printing funny frames.
    Copyright (C) 2021 Ingostnus.
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as
    published by the Free Software Foundation, either version 3 of the
    License, or (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.
    
    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
    """
    
    from math import sqrt
    
    _str = "sample"                  # String to be turned into a funny frame.
    _sep = ' '                       # Separator, i.e. a string to be inserted between each letter of the _str.
    _vertical_separator_mode = 'F'   # Determines whether separator should be printed between each row.
                                     # ... 'F' --> off. 'T' --> on.
    
    def get_user_input() -> None:
        """
        This function lets user input desired values and override the defaults.
        """
        global _str; _str = str(input("String: "))
        global _sep; _sep = str(input("Character: "))
        global _vertical_separator_mode; _vertical_separator_mode = str((input("VSM (T/F):")))
        if _vertical_separator_mode == 'T':
            print("VMS is ON!!!")
    
    def print_frame(printer = print) -> list:
        """
        This function is designed for printing a frame. Custom printer function
        may be supplied to process the output in a specific way.
        """
    
        buffer_len = (len(_str) + len(_sep) * (len(_str) - 1))**2
    
        # First line.
        printer(''.join([_str[i] + _sep if i < (len(_str) - 1) else _str[-1] for i in range(len(_str))]))
        
        # Second -- pre last lines.
        empty_space = ' ' * (int(sqrt(buffer_len)) - 2)
        for i in range(1, len(_str) - 1):
            # If vertical separator mode is toggled, print vertical separator.
            if _vertical_separator_mode == 'T':
                printer(_sep + empty_space + _sep)
            printer(_str[i] + empty_space + _str[-(i + 1)])
        
        # Last line.
        printer(''.join([_str[-(i + 1)] + _sep if i < (len(_str) - 1) else _str[0] for i in range(len(_str))]))
    
    # To give the best perfomance and flexibility, this module should be used as
    # an imported library. Though, its basic functionality can be used even if
    # it's executed directly.
    if __name__ == '__main__':
        get_user_input()
        print_frame()

    Переписала код https://govnokod.ru/27348 на питон, добавив чуть-чуть улучшений и немноже4ко документацци.

    Запостил: KoWe4Ka_l7porpaMMep, 11 Апреля 2021

    Комментарии (26) RSS

    • S E O п о с т
      E           с
      O           о
      п   =^~^=   п
      о           O
      с           E
      т с о п O E S
      Ответить
    • Переведи на Росiйскую Народную Республику, пятоколонник!
      Ответить
      • Но у меня ни коленок, ни локтей на пятках нет (((
        Ответить
    • Идея немного другая. Изначально разделитель должен же был быть внутри рамки?

      В этом коде если в разделителе больше одного символа, то разделитель начинает съезжать по правой вертикальной границе. Также нет разделителя в предпоследней строке.
      Ответить
      • Да.

        Я просто забыл, о чём был код, а пересчитывать было лень, поэтому я написал заново, как запомнил.
        Ответить
    • Только "перепесала". https://govnokod.ru/22757
      Ответить
    • >global
      дальше не читал
      Ответить
      • А чем он плох в данном контексте? Если бы я сделал класс с двумя методами и тремя полями, и глобал бы исчез, что бы кардинально изменилось, учитывая, что глобальные переменные модуля начинаются с «_», т.к. они не импортируются и трогать их ненужно?
        Ответить
        • Во мне можно писать $GLOBALS["_str"]
          Ответить
        • Что, никто не знает?

          Для новичков: не переопределяйте глобальные переменные вообще, то есть избегайте global. Считайте каждое появление global в коде ошибкой, если нет особых причин для использования этой конструкции (как в примере с multiprocessing). Если не получается избавится от global, то создайте минимальный пример кода и задайте отдельный вопрос: "как избавиться от global, делая X"

          Какой глобофоб )))

          примером из жизни может послужить любая крупная поделка на php, когда тебе нужно найти место, где эта переменная объявляется. так в питоне поиск global переменной сразу сократится до одного файла.

          И чем это плохо? Чем же? Нет, с пхп всё понятно – там это ОЧЕНЬ плохо. А в питоне почему это моветон?
          Ответить
          • > А в питоне почему это моветон?

            Ну это как статик глобалка в няшной. С одной стороны это уже намного лучше, чем настоящая глобалка. А с другой -- тестированию немного мешает, да и о многопоточности приходится задумываться.

            З.Ы. Для мелкой одноразовой скриптушни и так сойдёт, конечно.
            Ответить
            • Хорошо, я по-ня-л.

              В данном конкретном случае наилучший вариант был бы передавать _str и _sep как аргументы с дефолтными значениями.
              Ответить
              • Именно так.
                Ответить
              • И как бы ты правил их значения из тела функции?
                Ответить
                • Он про print_frame, там это действительно просто аргументы.
                  Ответить
                  • А я про get_user_input
                    ну тогда нужно эту структуру отдавать из функции

                    Ключ слово "global" пахнет говном. Если можно не пахнуть говном, то лучше не пахнуть говном. Нет?
                    Ответить
                    • А из get_user_input их надо просто вернуть, не?
                      Ответить
                      • да, так тоже можно

                        govno = get_user_input()
                        print_govno(govno)

                        никакова глобал
                        Ответить
                        • В первой версии библиоеки был глобальный буффер, который имело смысл хранить, чтобы экономить пирфоманс и занимать память. Потом я его убрал и глобал стал нинужен.
                          Ответить
        • Потому что если нечто описывает стейт твоего приложения (а они описывают) то нужно делать из них структуру и передавать ее. Либо сделать класс, а их сделать филдами, и тогда ты эту структуру -- self -- будешь получать автоматом.

          Если же это ридонли константы, то можно читать их вообще без global (и лучше наверное сделать их большими буквами, хотя в питоне (в отличие от языка японских богов) это на ридонли не влияает)
          Ответить
    • argparse не хочешь заюзать?
      Ответить
      • Интересная штука. Чем-то похожим пользовался для фласка, там был какой-то «manager», чтобы приложению из командной строки подсовывать порт и хост.
        Ответить
        • Ну и в целом параметры удобнее передавать в аргументах, а не интерактивно через stdin...
          Ответить
          • Да, это правда. И тестировать так гораздо удобнее.
            Ответить

    Добавить комментарий