Проверка переменной arg[4] в начале класса

никак не получается проверить существование переменной в начале класса, подскажите как реализовать?
начало кода класса:

class MButton():
    def __init__(self, *arg):
        self.parent = arg[0]
        self.limage = arg[1]
        self.lcommand = arg[2]
        self.rcommand = arg[3]

пробовал что-то типа этого:,
(и еще несколько вариантов...)

try:
    arg[4]
except IndexError:
    arg[4] = None

Вопрос 2:

а что если такими вариантами? допустимо? что лучше?

Вариант-1:

Вызов:
self.test = MTest(width=10, height=10, **{'bdsize':1, 'bgcolor':2, 'parent':3})

class MTest():
    def __init__(self, width, height, **args):
        self.width=width
        self.height=height
        self.bdsize=args['bdsize']
        self.bgcolor=args['bgcolor']
        self.bdcolor=args['bdcolor']
        self.parent=args['parent']

Вариант-2:

Вызов:
self.test = MTest(**{'width':10, 'height':10, 'bdsize':1, 'bgcolor':2, 'parent':3})

class MTest():
    def __init__(self, **args):
        self.width=args['width']
        self.height=args['height']

        self.bdsize=args.get('bdcolor')
        self.bgcolor=args.get('bdcolor')
        self.bdcolor=args.get('bdcolor')
        self.parent=args.get('bdcolor')

Вариант-3:

Вызов:
self.test = MTest(**{'width':10, 'height':10, 'bdsize':1, 'bgcolor':2, 'parent':3})

class MTest():
    def __init__(self, **args):
        self.width=args.get('width')
        self.height=args.get('height')
        self.bdsize=args.get('bdcolor')
        self.bgcolor=args.get('bdcolor')
        self.bdcolor=args.get('bdcolor')
        self.parent=args.get('bdcolor')
        
        if not self.width == None or self.height == None:
            raise Exception('ERROR: Проверьте правильность введенных данных обязательных параметров width и height !')

Вариант-4:

Вызов:
self.test = MTest(width=10, height=10, bdsize=1, parent=3)

class MTest():
    def __init__(self, **args):
        self.width=args['width']
        self.height=args['height']
        self.bdsize=args.get('bdsize')
        self.parent=args.get('parent')
        self.bgcolor=args.get('bgcolor')
        self.bdcolor=args.get('bdcolor')

Вариант-5:

Вызов:
self.test = MTest(width=10, height=10, bdsize=1, parent=3)

class MTest():
    def __init__(self, width, height, bdsize=None, bgcolor=None, bdcolor=None, parent=None):
        self.width=width
        self.height=height
        self.bdsize=bdsize
        self.bgcolor=bgcolor
        self.bdcolor=bdcolor
        self.parent=parent

Ответы (2 шт):

Автор решения: strawdog

почитайте про **kwargs и метод словаря get:

class MyClass():
    def __init__(self, **kwargs):
        self.one = kwargs.get("one")
        self.two = kwargs.get("two")
        self.three = kwargs.get("three")
        self.four = kwargs.get("four")
            
    def show(self):
        print(id(self))
        print(self.one)
        print(self.two)
        print(self.three)
        print(self.four)
        
d1 = {"one":1, "two":3, "three":3, "four":4}
d2 = {"one":1, "three":3, "four":4}

c1 = MyClass(**d1)
c2 = MyClass(**d2)

c1.show()
# 153208200
# 1
# 3
# 3
# 4

c2.show()
# 153208456
# 1
# None
# 3
# 4

Если нужно выводит ошибку при отсутствии параметра, то можно дописать,например:

if not self.one: # или if sel.one == None
    raise Exception('My error!')
→ Ссылка
Автор решения: insolor

Если у вас ограниченный набор параметров, лучше не прятать их за *args или **kwargs.

Рабочий вариант для самого первого случая:

class MButton():
    def __init__(self, parent, limage, lcommand, rcommand=None):
        self.parent = parent
        self.limage = limage
        self.lcommand = lcommand
        self.rcommand = rcommand

Последний параметр необязательный.

Для "Вариант-1":

class MTest():
    def __init__(self, width, height, bdsize=None, bgcolor=None, parent=None):
        self.width=width
        self.height=height
        self.bdsize=bdsize
        self.bgcolor=bgcolor
        self.parent=parent


test = MTest(width=10, height=10, bdsize=1, bgcolor=2, parent=3)

Также в заголовке методов можно указывать типы параметров, например:

class MTest():
    def __init__(self, width: int, height: int, bdsize: int=None, parent=None):
        self.width=width
        self.height=height
        self.bdsize=bdsize
        self.parent=parent

Если вы попытаетесь передать в параметр значение другого типа, PyCharm подсветит этот код, либо при проверке через mypy будет показана ошибка. При запуске кода в интерпретаторе правда ошибок может не быть, т.к. Python - язык с динамической типизацией (ошибка возникнет, например, если вы ожидаете что значение целочисленное, и вы попытаетесь работать с ним как с числом, а передали до этого, например, строку).

Про аннотации типа можно почитать здесь: Введение в аннотации типов Python

В любом случае, явное перечисление параметров метода можно считать видом документации. То что IDE и редакторы кода это умеют обрабатывать и выводят подсказки во время написания кода (см. скриншоты ниже) намного упрощает программирование (даже IDLE в интерактивном режиме выводит подсказку с параметрами). Указывая один параметр *args или **kwargs вы лишаете себя этих возможностей.

VSCode: Скрин VSCode

PyCharm: Скрин PyCharm

→ Ссылка