Я думаю, что вы должны сделать какой-то дизайн программного обеспечения с помощью логики c и шаблонов проектирования:
Упрощение логики c может помочь: если это первый случай, он все равно перезаписывается здесь , Так не будет, но, может быть, logi c может быть проще.
if extras["para1"] and extras["para2"]:
a = extras["para3"]
elif extras["para1"]:
a = extras["para4"]
Или вы группируете параметры в логические группы, например, вложенные dicts или json.
Example("x", {"kwargs1": {"kw":arg, ...}, "kwargs2":{}...})
Или, что может быть лучше: с наследованием и полиморфизмом вы можете разделить логи c и повторно использовать общий код, как сейчас. Это основная причина его использования.
class AbstractExample:
def __init__(self, mainArgument, a=None, b="123", c="path|to|"):
self.setup(a)
self.do(b)
self.save_at(c)
def setup(self,a):
self.a =
def do(self, b):
self.value = b(self.a)
def save_at(path):
with open (path) as something:
something.save(self.value)
class ExampleA(AbstractExample):
def __init__(self, *args, extra_arg="special", **kwargs):
super().__init__(*args,**kwargs)
print(extra_arg)
def save_at(path):
# not saving
pass
class ExampleB(AbstractExample):
def __init__(self, *args, anything_else="also_important", **kwargs):
super().__init__(*args,**kwargs)
print(anything_else)
def do(b):
# do something that is special in for cases like this
def save_at(path):
# these methods override the base class behavior
non_overloading_method_to_do_this()
def non_overloading_method_to_do_this():
С несколькими уровнями наследования вы можете разделить каждый случай, который вам нужен, и вы увидите, что для этого гораздо проще думать и отлаживать это, чем логику c ты сделал. Он вызовет все методы в init в зависимости от объекта, который вы создаете:
a = ExampleA(..., extra_arg="special", ...)
b = ExampleB(..., anything_else="also_important", b="1""...)