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

Сейчас в коде у меня есть такая функция:

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
→ Ссылка