Как сделать так, чтобы функция могла по-разному принимать аргументы?
Сейчас в коде у меня есть такая функция:
def rgbToHex(r: int | None = None, g: int | None = None, b: int | None = None, rgb: tuple[int, int, int] | None = None
Я хочу, чтобы в функцию можно было по-разному передавать аргументы без их названия, то есть rgbToHex(tuple(r, g, b)) или rgbToHex(r, g, b). Это возможно?
Ответы (2 шт):
Автор решения: Алексей Р
→ Ссылка
Не спец в тайпинге, но можно задать переменное число позиционных аргументов и реализовать проверку следующим образом:
def rgbToHex(*args):
if len(args) == 1 and isinstance(args[0], tuple) and len(args[0]) == 3 and all(isinstance(a, int) for a in args[0]):
rgb = hex(args[0][0] + args[0][1] * 256 + args[0][2] * 65536)
elif len(args) == 3 and all(isinstance(a, int) for a in args):
rgb = hex(args[0] + args[1] * 256 + args[2] * 65536)
else:
raise TypeError(f'Неверные аргументы: {args}, ожидалось tuple[int,int,int] или int,int,int')
return rgb
print(rgbToHex(1, 2, 3))
print(rgbToHex((1, 2, 3)))
print(rgbToHex((1, 2)))
print(rgbToHex(5))
print(rgbToHex((1, 2, 3), 4, 5))
0x30201
0x30201
Traceback (most recent call last):
File "C:\Users\...\PycharmProjects\test\main.py", line 38, in <module>
print(rgbToHex((1, 2)))
^^^^^^^^^^^^^^^^
File "C:\Users\...\PycharmProjects\test\main.py", line 32, in rgbToHex
raise TypeError(f'Неверные аргументы: {args}, ожидалось tuple[int,int,int] или int,int,int')
TypeError: Неверные аргументы: ((1, 2),), ожидалось tuple[int,int,int] или int,int,int
Автор решения: Церера
→ Ссылка
Попробуй так:
def rgbToHex(r: int | None = None, g: int | None = None, b: int | None = None, rgb: tuple[int, int, int] | None = None):
if rgb is not None:
r, g, b = rgb
if r is not None and g is not None and b is not None:
hex_color = "#{:02X}{:02X}{:02X}".format(r, g, b)
print(f"RGB ({r}, {g}, {b}) is equivalent to Hex color: {hex_color}")
else:
print("Invalid input")
# Вызовы функции
# Способ 1: Передача аргументов напрямую
rgbToHex(255, 0, 0) # RGB (255, 0, 0) is equivalent to Hex color: #FF0000
# Способ 2: Передача кортежа
rgbToHex(rgb=(0, 128, 255)) # RGB (0, 128, 255) is equivalent to Hex color: #0080FF
# Способ 3: Передача аргументов без их названий
rgbToHex(100, 200, 50) # RGB (100, 200, 50) is equivalent to Hex color: #64C832