我试图在我的第一个Python应用程序中坚持DRY原则(我是一位经验丰富的.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
在为绘图创建边界框时,我会重用此方法。此嵌套的for循环包含多个函数,因此拥有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()
如何将其作为参数传递给函数?我像在C#中一样尝试了以下操作(请参阅第二个参数plot
),但是它不起作用,并且在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 :(得分:1)
如果您仍然在函数内部使用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 :(得分:0)
您尚未显示正在使用的实际代码,但我认为您想要的是这样的东西:
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)
请注意如何将绘图函数作为函数传递,而不是作为调用的结果传递-无括号。