LINUX.ORG.RU

Список переменных в Python

 


0

2

Искал как сделать цветной вывод в python, нашёл такой способ:

class colortext:
	purple = '\033[95m'
	cyan = '\033[96m'
	darkcyan = '\033[36m'
	blue = '\033[94m'
	green = '\033[92m'
	yellow = '\033[93m'
	red = '\033[91m'
	bold = '\033[1m'
	underline = '\033[4m'
	end = '\033[0m'

print(colortext.bold + colortext.green + 'BOLD GREEN TEXT' + colortext.end)

Почему здесь сделано через класс? Это рациональный выбор, или оверхед? Какими способами можно ещё это сделать?

Deleted

Последнее исправление: beastie (всего исправлений: 1)

Почему здесь сделано через класс

Чтобы не засерать нэймспейс?

anonymous
()

Ты что узнать хочешь? Про цвета или про переменные или про классы?.. Получить список переменных в текущей области видимости можно с помощью locals(). С цветами — да это просто esc-последовательности. Нет, не рациональный способ, лучше делать так:

colortext = {
        'purple': '\033[95m',
	'cyan': '\033[96m',
        # и так далее
	'end': '\033[0m'
}
print("{bold}{green}BOLD GREEN TEXT{end}".format(**colortext))

УДобнее в использовании, читаемее, строки можно составлять не внутри принта плюсиками, а где угодно и удобно.

Psych218 ★★★★★
()
Последнее исправление: Psych218 (всего исправлений: 2)
Ответ на: комментарий от Psych218

Это работает до тех пор пока не попадётся терминал который не поддерживает цвета :(. Да и при выводе в файле я бы убирал цвета. Так что лучше всё же взять готовое решение для цветного вывода.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Не спорю. Но я отвечал на вопрос про то, оптимально ли это делать классом и потом вот так плюсовать. А так да, если есть готовое решение, то лучше воспользоваться им. Хотя тут тоже смотря что нужно, может там вывод в файл ну никак не предполагается (программа интерактивная например).

Psych218 ★★★★★
()
Ответ на: комментарий от Deleted

Смотри документацию на предмет функции format. Это одна из наиболее частых функций работы со строками, очень рекомендую в неё научиться.

Psych218 ★★★★★
()
Последнее исправление: Psych218 (всего исправлений: 1)
Ответ на: комментарий от Deleted

Ну тогда тем более, какая тебе разница что лишняя зависимость.

pawnhearts ★★★★★
()
Ответ на: комментарий от Deleted

Словарь раскрывается этими ** в именованные аргументы функции, потом через format они подставляются по имени.

anonymous
()
Ответ на: комментарий от Deleted

А две звёздочки перед colortext зачем?

Они разворачивают словарь (dict, {}) в список аргументов для функции, то есть оно превращается в format(purple="\033[95m", cyan="\033[96m", ..., end="\033[0m").

Psych218 ★★★★★
()
Ответ на: комментарий от Deleted

Кортеж не позволяет связывать пары ключ-значение. Нет, можно сделать, конечно, кортеж кортежей:

(
 ("purple", "\033[95m"),
 ("cyan", "\033[96m"),
 ...
)
Но это изврат ведь. Для этого специально существуют словари (более того, можно из такого кортежа как раз получить словарь: dict(этот_кортеж).

Кроме того, ** позволяет развернуть словарь в аргументы функции, что в данном случае очень удобно для format.

Psych218 ★★★★★
()
Последнее исправление: Psych218 (всего исправлений: 1)
Ответ на: комментарий от anonymous

Интересная штука. Не совсем понятно как реализовано вот такое:

>>> class Shape(Enum):
...     square = 2
...     square = 3
...
Traceback (most recent call last):
...
TypeError: Attempted to reuse key: 'square'

Всмысле, как такое на чистом питоне сделать.

pawnhearts ★★★★★
()
Ответ на: комментарий от Psych218

Так, это понятно, спасибо. Такой вопрос: например, у меня в словаре pathtofile есть ключ pathtofirstfile со значением /usr/bin/prog. Как мне его передать в функцию os.path.isfile()?

Deleted
()

оверхед

Доступ к атрибуту в пистоне в любом случае сведется к поиску в словаре. Быстрее - только если на сишке.

Deleted
()
Ответ на: комментарий от Deleted

Так, это понятно, спасибо. Такой вопрос: например, у меня в словаре pathtofile есть ключ pathtofirstfile со значением /usr/bin/prog. Как мне его передать в функцию os.path.isfile()?

Если я правильно понял вопрос, то тут же по-моему, совсем очевидно: os.path.isfile(pathtofile['pathtofirstfile'])

словарь[ключ] даёт значение по этому ключу…

Psych218 ★★★★★
()
Последнее исправление: Psych218 (всего исправлений: 1)
Ответ на: комментарий от Psych218

То есть вся разница чисто синтаксическая, по-моему. Через класс даже лаконичнее получается.

Deleted
()
Ответ на: комментарий от Deleted

Класс ты не сможешь развернуть в аргументы функции с помощью **. Также ты не сможешь по нему пройтись с помощью for. Не сможешь превратить его в список кортежей при желании, ну и т. д. Классы в основном для другого, у них методы желательны и т. д. Они в основном для ООП. Для простого списка пар ключ-значение специально предназначен словарь. Иногда, конечно, удобно использовать класс просто как область видимости, но не всегда. Вот например в этом случае не пройдёт фокус с удобным использованием format.

Psych218 ★★★★★
()
Последнее исправление: Psych218 (всего исправлений: 3)
Ответ на: комментарий от Psych218

Класс ты не сможешь развернуть в аргументы функции с помощью **.

Опять же, подозреваю, что можно извернуться с помощью метаклассов.

Deleted
()
Ответ на: комментарий от Deleted

Ага, так и есть, щас в исходники залез. Я даже и не знал про этот __prepare__, оказывается в питон3 с метаклассами много всего намудрили нового.

pawnhearts ★★★★★
()
Ответ на: комментарий от Deleted

Зато удобно... Ну либо напетуши свое, на выходе будет практически тоже самое. Зачем тратить силы?

FIL ★★★★
()
Ответ на: комментарий от Deleted

Опять же, подозреваю, что можно извернуться с помощью метаклассов.

более того, можно извернуться с помощью __dict__, но не нужно, конечно )))

Dred ★★★★★
()
Ответ на: комментарий от Deleted

ну или вообще можно поиграть с магическими методами и сымитировать словарь, ну это так, в теории

Dred ★★★★★
()

Можно сделать через namedtuple:

from collections import namedtuple

ColorText = namedtuple('ColorText', ['purple', 'cyan', 'darkcyan', 'blue', 
                                     'green', 'yellow', 'red', 'bold', 'underline',
                                     'end'])

my_color_theme = ColorText(**{
    'purple': '\033[95m',
    'cyan': '\033[96m',
    'darkcyan': '\033[36m',
    'blue': '\033[94m',
    'green': '\033[92m',
    'yellow': '\033[93m',
    'red': '\033[91m',
    'bold': '\033[1m',
    'underline': '\033[4m',
    'end': '\033[0m',
})

print(my_color_theme.bold + my_color_theme.green + 'BOLD GREEN TEXT' + my_color_theme[-1])
print('{bold}{green}BOLD GREEN TEXT{end}'.format(**my_color_theme._asdict()))
print(my_color_theme)
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.