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,有人可以解释一下吗?
这是通过 Python 的func_globals魔法来完成的,即
\n\n\n对保存函数\xe2\x80\x99s 全局变量的字典的引用\xe2\x80\x94 定义该函数的模块的全局命名空间。
\n
如果您深入研究 PyQuery 代码:
\n\ndef 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))\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
562 次 |
| 最近记录: |