为什么这个未绑定的变量可以在Python(pyquery)中工作?

Han*_*Sun 11 python variables pyquery

代码来自pyquery的指南

from pyquery import PyQuery
d = PyQuery('<p class="hello">Hi</p><p>Bye</p>')
d('p').filter(lambda i: PyQuery(this).text() == 'Hi')
Run Code Online (Sandbox Code Playgroud)

我的问题是this在第3行是一个未绑定的变量,并且从未在当前环境中定义,但上述代码仍然有效.

它怎么样?为什么不抱怨NameError: name 'this' is not defined

似乎有事情发生在https://bitbucket.org/olauzanne/pyquery/src/c148e4445f49/pyquery/pyquery.py#cl-478,有人可以解释一下吗?

Zau*_*bov 4

这是通过 Python 的func_globals魔法来完成的,即

\n\n
\n

对保存函数\xe2\x80\x99s 全局变量的字典的引用\xe2\x80\x94 定义该函数的模块的全局命名空间。

\n
\n\n

如果您深入研究 PyQuery 代码:

\n\n
def func_globals(f):\n    return f.__globals__ if PY3k else f.func_globals\n\ndef filter(self, selector):\n    if not hasattr(selector, '__call__'):\n        return self._filter_only(selector, self)\n    else:\n        elements = []\n        try:\n            for i, this in enumerate(self):\n\n                # The magic happens here\n                func_globals(selector)['this'] = this\n\n                if callback(selector, i):\n                    elements.append(this)\n\n        finally:\n            f_globals = func_globals(selector)\n            if 'this' in f_globals:\n                del f_globals['this']\n        return self.__class__(elements, **dict(parent=self))\n
Run Code Online (Sandbox Code Playgroud)\n