该代码来自pyquery的指南
from pyquery import PyQuery
d = PyQuery('<p class="hello">Hi</p><p>Bye</p>')
d('p').filter(lambda i: PyQuery(this).text() == 'Hi')
我的问题是第三行中的
this
是一个未绑定(bind)的变量,并且在当前环境中从未定义过,但是上面的代码仍然有效。如何运作?为什么不提示
NameError: name 'this' is not defined
?https://bitbucket.org/olauzanne/pyquery/src/c148e4445f49/pyquery/pyquery.py#cl-478似乎发生了什么,有人可以解释吗?
最佳答案
这是通过Python的func_globals
魔术完成的,
如果您深入研究PyQuery代码:
def func_globals(f):
return f.__globals__ if PY3k else f.func_globals
def filter(self, selector):
if not hasattr(selector, '__call__'):
return self._filter_only(selector, self)
else:
elements = []
try:
for i, this in enumerate(self):
# The magic happens here
func_globals(selector)['this'] = this
if callback(selector, i):
elements.append(this)
finally:
f_globals = func_globals(selector)
if 'this' in f_globals:
del f_globals['this']
return self.__class__(elements, **dict(parent=self))
关于python - 为什么这个未绑定(bind)变量可以在Python(pyquery)中工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11814813/