2012-10-02 62 views
0

this Kivy code内:使用 - 如何知道哪些变量是上下文

class MyPaintWidget(Widget): 
    def on_touch_down(self, touch): 
     userdata = touch.ud 
     with self.canvas: 
      Color(1, 1, 0) 
      d = 30. 
      Ellipse(pos=(touch.x - d/2, touch.y - d/2), size=(d, d)) 
      userdata['line'] = Line(points=(touch.x, touch.y)) 

显然ColordEllipseself.canvas命名空间内,但Python是怎样知道userdata不在范围相同命名空间?

+0

'Color'和'Ellipse'都被'由线'从kivy.graphics import'ed导入颜色, Ellipse'。我认为你误解了'with'语句 - 它与命名空间无关。快速谷歌给[几](http://effbot.org/zone/python-with-statement.htm)[在线](http://preshing.com/20110920/the-python-with-statement-by-例如)[tutorials](http://python.about.com/od/gettingstarted/qt/py25WITH.htm),以及[官方文档](http://docs.python .ORG /参考/ compound_stmts.html#中,有语句)。 –

回答

5

编辑:这个答案得到了有点冗长,所以这里的总结:

  1. with self.canvas定义当前活动画布以下代码块。
  2. 在活动画布上绘制所有绘图说明,如ColorEllipse

命名空间实际上并没有任何关系,它是重要的上下文(见下文)。

with声明允许您使用所谓的context managers

语法是这样

with thing [as foo]: 

其中thing通常是装饰的装饰contextlib.contextmanager的函数。上下文管理器的功能取决于如何实现thing

但它没有做的是让变量神奇地出现在你的范围内。对上下文的引用可以通过可选的as foo子句获得,但就是这样。您的示例中的ColorEllipse是来自其他地方(可能是进口?)。

为了找出到底在with self.canvas行上下文经理呢,你应该看看API documentationsource codekivy.graphics.instructions.Canvas什么。

下面是本教程的相关摘录:

通过使用与它声明,所有后续绘图命令 已正确缩进将修改这个画布。附带声明 也确保在我们绘图后,内部状态可以正确清理 。

所以使用ColorEllipse影响self.canvas,但他们不以任何方式通过with语句定义。

查看源代码,这是它如何工作的:

def class CanvasBase(InstructionGroup): 
    def __enter__(self): 
     pushActiveCanvas(self) 

    def __exit__(self, *largs): 
     popActiveCanvas() 

__enter____exit__定义如果输入上下文管理器(的缩进代码with语句后的第一行之前)发生了什么和退出。

在这种情况下,画布被简单地推到堆栈上,该堆栈定义当前活动画布(如果退出上下文管理器,则从其弹出)。

kivy.graphics.instructions.Instruction,表观基类所有绘图指令,所述parent is set to the currently active canvas

self.parent = getActiveCanvas() 
1

其实,ColorEllipsekivy.graphics代码稍微高一点的输入:

from kivy.graphics import Color, Ellipse 

要回答你关于命名空间的问题,蟒蛇并不需要“知道”什么命名它从获取变量所有。与像Java这样的语言相比,它具有非常简单的命名空间规则,它们依次搜索函数,对象,类,全局和包范围。 Python有一个全局命名空间(每个模块)和一个本地命名空间堆栈(例如,嵌套函数可以从外部函数获取变量)。它只是在范围列表下面,直到找到有问题的变量名称。

上面的with声明具有特殊的意义,但我想即使with不能隐式引入新的变量到本地范围(它可以与as条款明确地引入一个变量,虽然)。

相关问题