Я пытаюсь придерживаться принципов СУХОЙ в своем первом приложении на Python (я опытный разработчик .NET).Я был в состоянии переместить большую часть моего повторного кода в многократно используемые функции.
Например, вот как я создаю линии (ограничивающие прямоугольники) для сюжета matplotlib:
def generate_bounding_box_polygon(comma_delimited_rect: str):
box_coordinates = comma_delimited_rect.strip().split(',')
x = int(box_coordinates[0].strip())
y = int(box_coordinates[1].strip())
width = int(box_coordinates[2].strip())
height = int(box_coordinates[3].strip())
bottom_left = [x, y]
bottom_right = [x + width, y]
top_left = [x, y + height]
top_right = [x + width, y + height]
points = [bottom_left, top_left, top_right, bottom_right, bottom_left]
polygon = plt.Polygon(points, fill=None, edgecolor='xkcd:rusty red', closed=False)
return polygon
Я снова использую это при создании ограничивающих рамок для своего графика.Этот вложенный цикл находится в нескольких функциях, поэтому наличие функции generate_bounding_boxes
приятно и аккуратно
for region in result["regions"]:
region_box = generate_bounding_box_polygon(region["boundingBox"])
plt.gca().add_line(region_box)
for line in region["lines"]:
line_box = generate_bounding_box_polygon(line["boundingBox"])
plt.gca().add_line(line_box)
for word in line["words"]:
detected_text += word
word_box = generate_bounding_box_polygon(word["boundingBox"])
plt.gca().add_line(word_box)
# RELEVANT this is the code I want to move into a function
box_coordinates = word["boundingBox"].strip().split(',')
x = int(box_coordinates[0].strip())
y = int(box_coordinates[1].strip())
plt.gca().text(x, y-10, word["text"], fontsize=8)
Однако обратите внимание, что в последнем комментарии к коду я хочу также переместить метод text
в функциюно мне нужна ссылка на plt.gca()
Как я могу передать это функции в качестве параметра?Я попробовал следующее (см. 2-й параметр, plot
), как в C #, но это не работает и, вероятно, плохая практика в python:
def render_text(comma_delimited_rect: str, plot: matplotlib.pyplot):
box_coordinates = comma_delimited_rect.strip().split(',')
x = int(box_coordinates[0].strip())
y = int(box_coordinates[1].strip())
plt.gca().text(x, y-10, word["text"], fontsize=8)
Примечание: plt
определяется как import matplotlib.pyplot as plt