Я пытаюсь придерживаться принципов СУХОЙ в своем первом приложении на 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

0
Lance McCarthy 26 Сен 2018 в 01:16

2 ответа

Лучший ответ

В любом случае, если вы используете plt.gca() внутри своей функции, дополнительный аргумент не требуется.

def render_text(comma_delimited_rect):
    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)

Если вместо этого вы хотите передать оси для построения графика, вы должны передать это функции

def render_text(comma_delimited_rect, word, axes):
    box_coordinates = comma_delimited_rect.strip().split(',')
    x = int(box_coordinates[0].strip())
    y = int(box_coordinates[1].strip())
    axes.text(x, y-10, word, fontsize=8)

Называя это, например,

render_text( word["boundingBox"],  word["text"], plt.gca())
1
ImportanceOfBeingErnest 25 Сен 2018 в 22:30

Вы не показали реальный код, который вы используете, но я думаю, что вы хотите что-то вроде этого:

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())
    plot().text(x, y-10, word["text"], fontsize=8)

... и позвонил с ...

render_text(word["boundingBox"], plt.gca)

Обратите внимание, как вы передаете функцию построения как функцию , а не как результат вызова - без скобок.

0
Prune 25 Сен 2018 в 22:21