You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于pycairo装饰器示例的疑问:未显式调用函数为何能执行?

疑问:未显式调用函数却生成图形的原因

这段来自GitHub的pycairo示例代码在Jupyter Notebook中能生成内嵌圆形,但看起来只定义了函数没有显式调用,为什么会自动运行生成图形?

import cairo
from IPython.display import Image, display
from math import pi
from io import BytesIO

def disp(draw_func):
    surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 200, 200)
    ctx = cairo.Context(surface)
    draw_func(ctx, 200, 200)
    with BytesIO() as fileobj:
        surface.write_to_png(fileobj)
        display(Image(fileobj.getvalue(), width=200))
@disp
def draw(cr, width, height):
    # cr.scale(width, height)
    cr.set_line_width(8)
    cr.arc(100, 100, 60, 0, 2 * pi)
    cr.stroke()

核心原因:Python装饰器的自动执行机制

你忽略的是**@disp这个装饰器的作用**,它不是普通的函数定义标记,而是会触发一系列自动执行的逻辑:

  • @disp是Python的装饰器语法糖,等价于在定义完draw函数后自动执行draw = disp(draw)
  • 当代码执行到这一行时,disp函数会立即被调用,参数就是刚定义好的draw函数
  • 在disp函数内部,不仅创建了绘图所需的surface和上下文ctx,还主动调用了draw_func(ctx, 200, 200)——也就是执行了draw函数里的绘图逻辑
  • 最后disp函数把生成的PNG图像通过Jupyter的display接口展示出来,整个过程不需要你手动写draw()去调用

简单说,装饰器@disp已经替你完成了对draw函数的调用,还打包处理了绘图结果的显示逻辑。

内容的提问来源于stack exchange,提问作者Prof Michael Huster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:20:32