Я довольно долго искал это, поэтому, пожалуйста, извините, если я что-то упустил.
Обычно я хочу, чтобы методы в моей системе имели только явные именованные аргументы (кроме себя, конечно), например:
# want an explicit parameter signature
def method_1(self, *, x = None, y = None):
. . .
# and here i want to pass x and/or y if they are not None
possible_args = { }
if x is not None:
possible_args['x'] = x
if y is not None:
possible_args['y'] = y
self.method_2(**possible_args)
# want an explicit parameter signature
def method_2(self, *, x = 1, y = None):
. . .
к сожалению, значения x и / или y не отображаются в названные аргументы в method_2, но если я сделаю это вместо этого в конце method_1:
self.method_2(x = x, y = y)
тогда значения по умолчанию x и y из метода_1 переопределяют значения по умолчанию, выраженные в сигнатуре метода_2.
то, что я хочу, - это способ без размытия сигнатур методов путем принятия полностью открытого и неуказанного ** kwargs, чтобы сопоставить все, что может быть указано в вызове dict, в явные именованные параметры и не переопределять значения по умолчанию для других аргументов, которые не переданы диктат
Это возможно?
это для системы из сотен классов, и их интерфейсы должны быть очень хорошо определены, иначе это просто безумие. вот почему я не хочу передавать ** kwargs, кроме как в очень контролируемой манере, и я также хочу воспользоваться преимуществами именованных аргументов, значения по умолчанию которых указаны в сигнатуре метода. в противном случае, конечно, я мог бы иметь дело со значениями по умолчанию в теле метода:
if x is None:
x = 5
это просто не так приятно ...