У меня есть такой дикт:
colour_dict = {'Red': '0xFF, 0x00, 0x00','Green':'0x00, 0xFF, 0x00','White':'0xFF, 0xFF, 0xFF','Yellow':'0xff, 0xff, 0x00'}
Мне нужно передать значение этого словаря в этот код, и он работает правильно:
from pptx.dml.color import RGBColor
RGBColor(0xFF, 0x00, 0x00)
Когда я делаю ниже, чтобы добиться того же:
RGBColor(colour_dict["Red"])
Это выдает мне ошибку, так как это строка, и это просто нужно в прямом числовом формате.
Я уже пытался преобразовать эту строку в формат int, но ничего не работает.
Общая проблема:
Как передать значение в RGBColor с помощью dict?
@ h4z3: я не говорю, что это проблема с dict, все, что я пытаюсь сказать, это как решить эту проблему, учитывая, что она дает строку
Что касается конвертации, не забудьте передать, какую базу использовать: int('0xFF', base=16)
colour_dict["Red"]
— это нить"0xFF, 0x00, 0x00"
, который, конечно, нельзя напрямую преобразовать в int
.
Вам нужно преобразовать каждую часть строки и передать эти значения конструктору RGBColor
:
color = RGBColor(*map(lambda v : int(v, 16), colour_dict["Red"].split(',')))
ПРИМЕЧАНИЕ: В этой строке много чего происходит, поэтому я разобью ее и объясню:
colour_dict["Red"].split(',')
извлекает подстроки значений цвета: ['0xFF', '0x00', '0x00']
map()
применяет функцию, переданную в качестве первого аргумента, к каждому значению в итерации, переданной в качестве второго аргумента.
lambda v : int(v, 16)
преобразует v
из шестнадцатеричной строки в целое число
*
перед map
mans "распаковать значения в следующей итерации". это удобный способ передать список значений RGB вместо вызова RGBColor(R_val, G_val, B_val)
.
Поскольку python 2 не поддерживает оператор звездочки, вам нужно разделить оператор на две части:
r,g,b = map(lambda v : int(v, 16), colour_dict["Red"].split(','))
color = RGBColor(r,g,b)
Или просто измените dict на colour_dict = {'Red': [0xFF, 0x00, 0x00],...}
, а затем позвоните RGBColor(*colour_dict["Red"])
Да, конечно, изменение ввода решит проблему, но ОП специально запрашивает способ передачи цвета в виде строкового формата.
Я не критиковал ваш ответ, я просто хотел указать, что изменение ввода сделает код более читаемым.
@orangeInk Я согласен, но возможно, что dict просто указан в этом формате (например, значения загружаются из файла), поэтому я обычно предполагаю, что изменение формата ввода не является возможным решением :)
@GPhilo: Можете ли вы также дать соответствующий ответ Python 2.7 на это ... поскольку оператор *
показывает ошибку !!
Вместо Python 2.7
написано Invalid Syntax
Заменять
RGBColor(colour_dict["Red"])
к
eval("RGBColor({})".format(colour_dict["Red"]))
Всегда следует избегать использования eval
, если есть жизнеспособная альтернатива
color_dict["Red"] - это строка, а не три числа
вы можете сделать так:
a = list(colour_dict["Red"])
RGBColor(int(a[0]), int(a[2]), int(a[4]))
a:['0xFF', ',', '0x00', ',', '0x00'], всего 5 символов
Это не проблема со словарем.
colour_dict["Red"]
— это нить'0xFF, 0x00, 0x00'
, а не 3 отдельных числовых значения. Сопоставьте свой словарь и проанализируйте значения в кортежах/трехэлементных списках числовых значений.