метод переписывания с меньшим количеством аргументов - Python - PullRequest
2 голосов
/ 01 апреля 2020

Для простоты у меня есть старый класс cal1 с методом def calculate(self,a,b,c,d,e), и есть много мест, где этот метод вызывается, например: ans=cal1.calculate(a,b,c,d,e).

Теперь у меня есть новый класс cal2 который должен заменить старый класс всеми методами, использующими те же имена, что и cal1, но новому нужно только меньше аргументов c, d, e def calculate(self,c,d,e), а не a, b.

Вопрос: Есть ли способ переоборудовать новый метод calculate(self,c,d,e) для старых кодов без изменения каждой строки в старом коде (например, сохранение ans=cal.calculate(self,a,b,c,d,e))? Единственный способ, который я знаю, - это изменить новый метод, чтобы взять в качестве пустышки a и b, calculate(dummy_a, dummy_b, c, d, e), но тогда для будущего кода мне понадобится dummy_a, dummy_b.

1 Ответ

2 голосов
/ 01 апреля 2020

ЕСЛИ вы задаете аргументы с помощью ключевых слов (например, c="value", d="value", e="value", тогда это удобно.

С позиционными аргументами вы можете захватывать и распаковывать только те элементы, которые вам нужны.

Старая сигнатура функции вычисления

def calculate(self, a, b, c, d, e):
    ...

Новая сигнатура метода вычисления (с аргументами ключевого слова):

Вы можете использовать **kwargs для захвата всех ненужные аргументы здесь.

def calculate(self, c, d, e, **kwargs):
    ...

новая сигнатура метода вычисления (с позиционными аргументами):

Вы можете использовать *args для захвата всех аргументов и вытащите те, которые вы хотите.

def calculate(self, *args):
    *unnecessary, c, d, e = args
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...