首页 > 解决方案 > Python:将(否则)未定义的名称绑定到对象

问题描述

这个问题源于一个非常具体的用例。一些聪明的人整理了一个 repl.it,它允许您在网络上使用 Python 版本的处理库:

https://repl.it/@templates/Python-Processing

Python 代码如下所示:

from browser import document, window, alert

def sketch(p): 
  #this p is needed. it will be the processing sketch itself.
  # to do things like background(0) instead do p.background(0)

    def setup():
        p.createCanvas(700, 410)
        p.background(0)
        p.rectMode(p.CENTER)


    def draw():
        #p.background(0) 
        p.fill(255,255,0,128)
        p.ellipse(p.mouseX,p.mouseY,50,50)


    def mousePressed(self):
        p.background(0)


    def keyPressed(self):
      if p.key==" ":
        print("Hallo")


    p.setup = setup
    p.draw = draw
    p.mousePressed = mousePressed
    p.keyPressed = keyPressed

myp5 = window.p5.new(sketch)

问题是我真的希望用户代码看起来像这样(就像在桌面版本的 Python 版本处理中一样):

def setup():
    createCanvas(700, 410)
    background(0)
    rectMode(CENTER)


def draw():
    fill(255,255,0,128)
    ellipse(mouseX, mouseY, 50, 50)


def mousePressed(self):
    background(0)


def keyPressed(self):
  if key==" ":
    print("Hallo")

...但正如您在 repl 中看到的,所有调用都必须以“p”开头。以便它们作用于处理草图,并包装在一个以该草图作为参数的函数中。

我想这个问题可以归结为:有没有办法包装东西,以便其他未定义的全局变量/函数(例如createCanvas)绑定到特定对象(在这种情况下解析为p.createCanvas)?

我承认这有点不合 Python,因为它是关于隐含原本显式的内容,但在这种情况下,它将有助于使代码更符合处理库的精神。

标签: pythonnamespacesprocessingrepl.it

解决方案


推荐阅读