#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 для получения дополнительной информации об оценке.