Проверка переменной 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 шт):
почитайте про **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!')
Если у вас ограниченный набор параметров, лучше не прятать их за *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 вы лишаете себя этих возможностей.

