Змея / Говнокод #27351 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 KoWe4Ka_l7porpaMMep, (Updated )

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

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

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

      Я просто забыл, о чём был код, а пересчитывать было лень, поэтому я написал заново, как запомнил.
      Ответить
    • А чем он плох в данном контексте? Если бы я сделал класс с двумя методами и тремя полями, и глобал бы исчез, что бы кардинально изменилось, учитывая, что глобальные переменные модуля начинаются с «_», т.к. они не импортируются и трогать их ненужно?
      Ответить
      • Что, никто не знает?

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

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

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

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

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

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

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

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

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

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8