Что хорошего в Python для сокращения повторения кода, когда функция с множеством параметров вызывается несколько раз?

1

У нас есть следующий вызов функции, используемый в нескольких местах в непосредственной близости:

func(param1, param2, param3, param4, param5)

Я хотел бы использовать

funccall() 

во всех местах.

Есть ли понятие макросов? Частицы со всеми приведенными аргументами (отмеченный ответ как правильный) правильный, и он работает, если все последующие вызовы находятся в одной области.

Что делать, если сценарий выглядит так:

A():
func(p1,p2,p3,p4,p5) # 3 times

B():
func(p1,p2,p3,p4,p5) # 2 times

C():
func(p1,p2,p3,p4,p5) # 4 times

Использование частичного:

A():
funccall = partial(func,p1,p2,p3,p4,p5)
funccall() # 3 times

B():
funccall = partial(func,p1,p2,p3,p4,p5)
funccall() # 2 times

C():
funccall = partial(func,p1,p2,p3,p4,p5)
funccall() # 4 times

Идеально (если в коде соблюдаются правила и читаемость не является проблемой)

macro funccall() = func(p1,p2,p3,p4,p5)

A():
funccall() # 3 times

B():
funccall() # 2 times

C():
funccall() # 4 times
  • 1
    Что вы подразумеваете под "в непосредственной близости"? Пожалуйста, предоставьте репрезентативный пример (примечание: нет макросов в Python, и из того, что вы описываете частичное применение, очевидное решение).
  • 0
    Python не имеет понятия о макросах: в динамическом языке не так много различий между вызовом макроса и вызовом функции. Вы можете упаковать несколько параметров в структуру данных (скажем, dict или именованный кортеж) и переопределить func() чтобы принять один параметр вместо многих; или принять структуру данных (по умолчанию: пустая структура данных) с отдельными параметрами в качестве необязательных переопределений.
Показать ещё 1 комментарий
Теги:
design
macros

2 ответа

2
Лучший ответ

Этот вопрос связан с этим

В качестве ответа, предоставленного MattH, вы можете использовать functools.partial

from functools import partial
funccall = partial(func, 1, 2, 3, 4, 5)
funccall()
1

установить параметры по умолчанию и только вызывать функцию явно с теми параметрами, которые отличаются от параметров по умолчанию!

например def func(param1=0, param2="abc", param3=0.3) для определения

и result = func(param1=3) при вызове.

(не проверено, но я не вижу причин, почему это не должно работать!)

  • 0
    это полезно, но в моем случае параметры должны быть переданы каждый раз. Единственное, что мы знаем, это то, что имена переменных параметров одинаковы для каждого вызова, который требует абстракции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню