Выполнение функций в словаре переключателей

Я столкнулся с проблемой при установке всех модулей, которые я разработал в основную программу. Словарь коммутатора, который я создал, можно увидеть ниже:

def Tank_Shape_Calcs(Tank_Shape, level, area, dish, radius, length, Strapping_Table, Tank_Number): switcher = { 0: vertical.Vertical_Tank(level, area), 1: horiz.Horiz_Cylinder_Dished_Ends(dish, radius, level, length), 2: strapping.Calc_Strapped_Volume(Strapping_Table, level), 3: poly.Fifth_Poly_Calcs(Tank_Number) } return switcher.get(Tank_Shape, "ERROR: Tank type not valid") 

Форма резервуара устанавливается в основной файл в петле для каждого из резервуаров. Первый танк имеет Tank_Shape = 2 поэтому я ожидаю, что он выполнит Calc_Strapped_Volume() .

Я попытался проверить его, и функция переключателя определенно читает Tank_Shape как 2 . Также, если я изменил функции на строки, он напечатает правильную строку.

Проблема в том, что функции, похоже, выполняются последовательно, пока не будет вызвана правильная функция. Это приводит к ошибкам, так как данные, которые я использую, будут работать только с правильной функцией.

Есть ли способ выполнить только правильную функцию?

3 Solutions collect form web for “Выполнение функций в словаре переключателей”

Все ваши функции выполняются при создании словаря, а не при доступе к ключу.

Вам нужно использовать lambda (без каких-либо параметров, они уже известны), чтобы убедиться, что функция вызывается только при необходимости:

 switcher = { 0: lambda : vertical.Vertical_Tank(level, area), 1: lambda : horiz.Horiz_Cylinder_Dished_Ends(dish, radius, level, length), 2: lambda : strapping.Calc_Strapped_Volume(Strapping_Table, level), 3: lambda : poly.Fifth_Poly_Calcs(Tank_Number) } 

затем вызовите, когда вы вернетесь, с сообщением об ошибке как лямбда, который возвращает его:

 return switcher.get(Tank_Shape, lambda : "ERROR: Tank type not valid")() 

Как отмечено, функции будут вызваны во время построения словаря. Кроме того, есть две другие проблемы, которые я вижу здесь:

  • Переопределяя switcher при каждом вызове функции Tank_Shape_Calcs , это, как правило, не очень хорошая идея.
  • Требование всех аргументов, которые должны быть переданы (из-за их определения как позиционеров), когда может потребоваться только несколько из них, вот почему мы имеем *args 🙂

Если мое понимание того, что вы делаете, правильное, я бы переключил переключатель вне функции, как Tank_Shape для function сопоставления объектов:

 switcher = { 0: vertical.Vertical_Tank, 1: horiz.Horiz_Cylinder_Dished_Ends, 2: strapping.Calc_Strapped_Volume, 3: poly.Fifth_Poly_Calcs } 

Затем определите Tank_Shape_Calcs чтобы взять лишние аргументы как кортеж с *args :

 def Tank_Shape_Calcs(Tank_Shape, *args): return switcher.get(Tank_Shape, lambda *_: "ERROR: Tank type not valid")(*args) 

и вызывать свою функцию после .get ting.

Это также .get трюк Джин, чтобы определить lambda в .get но делает это с помощью *_ , чтобы позволить ему получать .get со многими аргументами (которые, следовательно, игнорируются).

Что вы делаете в своем коде, создается словарь с целыми ключами (0-3), а результаты функции – как значения. Следовательно, вы сначала вызываете все функции, а затем получаете доступ к возвращаемым значениям этих функций. Я бы изменил ваш код следующим образом:

 def Tank_Shape_Calcs(Tank_Shape, level, area, dish, radius, length, Strapping_Table, Tank_Number): switcher = { 0: (vertical.Vertical_Tank, (level, area)), 1: (horiz.Horiz_Cylinder_Dished_Ends, (dish, radius, level, length)), 2: (strapping.Calc_Strapped_Volume, (Strapping_Table, level)), 3: (poly.Fifth_Poly_Calcs, (Tank_Number,)) } func, args = switcher.get(Tank_Shape, (None, None)) if func is not None: return func(*args) 

Здесь вы сначала получаете функцию, которую хотите вызвать, с соответствующими аргументами и вызывать ее.

  • Каковы хорошие возможности использования «Аннотации функций» Python3,
  • Python - как работают передаточные значения?
  • Создайте функцию, которая открывает файл и создает словарь
  • Где я могу поместить функции утилиты в проект Python?
  • Matplotlib: Сделать все значения в диапазоне, отображаемые по оси x
  • Python - загрузка файла - словарь
  • Чтение файла в словарь и подсчет количества записей
  • Python - использовать список как функциональные параметры
  • Python - лучший язык программирования в мире.