Могу ли я сделать UniCurses более Pythonic?
Я программист-любитель, изучаю Python. Поскольку модуль curses не работает в Windows, я смотрел на UniCurses, кроссплатформенную реализацию Curses. Я был разочарован, обнаружив, что функции UniCurses мало похожи на стиль Python, который я полюбил, вероятно, из-за устаревшей поддержки и исторических причин. Например, чтобы добавить текст в "окно" терминала, вы вызываетеwaddstr(WINDOW, str, [attr])
или mvwaddstr(WINDOW, y, x, str, [attr])
. Существуют десятки этих функций с загадочными именами, которые требуют передачи окна в качестве параметра и не обрабатывают окно как объект с методами, переменными экземпляра и т. Д.
Я бы предпочел писать в более питоническом стиле, где методы вызываются для объектов окна и панели, например window_instance.add_string(string, [attr])
, в идеале предоставляя необязательные параметры x и y методу для включения mvwaddstr()
в том же определении метода, что и waddstr()
.
На ум приходит определение класса для оконной конструкции следующим образом:
import unicurses
# this would normally be 'from unicurses import * ' but I'm trying to being explicit here
...
class PseudoWindow(object):
def __init__(self, num_cols,num_lines, begin_x, begin_y):
self.id = unicurses.newwin(nlines, ncols, begin_y, begin_x)
# use this value in unicurses functions
def __del__(self):
unicurses.delwin(self.id)
def add_string(self, string, [attr], x = None, y = None)
if x is None and y is None:
unicurses.waddstr(self.id, string, [attr])
else:
unicurses.mvwaddstr(self.id, string, y, x, [attr])
# wrap further unicurses functions into methods of PseudoWindow as required
Для неопытного программиста умственные затраты на переключение с одного языка на другой несколько высоки, и включение этих функций в более знакомый синтаксис может оказаться большим преимуществом для качества жизни. Мне что-то не хватает о том, как использовать UniCurses? Каковы недостатки и подводные камни подобного обертывания API на дополнительном уровне абстракции? Есть ли альтернатива этому подходу, которая позволила бы мне использовать стандартный объектно-ориентированный синтаксис Python?