该代码来自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/

10-12 18:35