добавляйте элементы в массив по их имени с помощью цикла for и форматируйте внутри функции

#python

#python

Вопрос:

Я пытаюсь добавлять элементы в массив по их имени. вот мой код:

 def create_filters(_shapes):
"""create masked filters to use on the image."""
  row, col = _shapes
  row, col  = int(row/2), int(col/2)
  urow, drow = row 10, row-10
  ucol, dcol = col 10, col-10

  masks = []
  mask1 = np.ones(_shapes, np.uint16)
  mask1[:,dcol:ucol] = 0
  # masks.append(mask1)
  mask2 = np.ones(_shapes, np.uint16)
  mask2[drow:urow,:] = 0
  # masks.append(mask2)
  mask3 = cv.bitwise_not(mask1)
  # masks.append(mask3)
  mask4 = cv.bitwise_not(mask2)
  # masks.append(mask4)
  mask5 = np.zeros(_shapes, np.uint16)
  mask5[drow:urow,dcol:ucol] = 255
  # masks.append(mask5)
  mask6 = cv.bitwise_not(mask5)
  # masks.append(mask6)
  mask7 = np.copy(mask1)
  mask7[drow:urow,:] = 0
  # masks.append(mask7)
  mask8 = cv.bitwise_not(mask7) 
  # masks.append(mask8)

  for i in range(1,9):
      m = globals()[f'mask{i}']
      masks.append(m)

  return masks
 

итак, в основном я хочу добавить все mask1-8 к маскам. Теперь, поскольку mask1-8 являются локальными переменными, я не могу использовать global().
Есть ли лучший способ сделать это? Я знаю, что могу инициализировать массив таким образом:

 masks=[mask1, mask2,...]
 

но я специально прошу использовать string в качестве имени переменной в цикле for.

Комментарии:

1. Просто определите их после с именами переменных, на самом деле нет необходимости делать это как цикл for

2. здесь я получил только 8 фильтров, что произойдет, если я получу 100? определить каждый? @Sayse

3. Почему вы не используете locals() ?

4. ЕГО РАБОТА! СПАСИБО @jtlz2

5. Но у вас нет 100, у вас есть 8. Если бы у вас было 100, я бы надеялся, что вы попытаетесь придумать лучшую логику для создания списка

Ответ №1:

Есть несколько способов сократить это, но для решения вашего конкретного вопроса:

Согласно моему комментарию, вы можете просто использовать locals() вместо globals() .

Ответ №2:

Другой вариант — использовать eval i.e:

 for i in range(1,9):
    m = eval(f"mask{i}")
    masks.append(m)
 

Функция eval анализирует и вычисляет любое выражение python, используя глобальное и локальное пространства имен. См. Документы python для получения дополнительной информации об оценке.