NameError:无法访问自由变量“fetcher”,因为它与封闭范围内的值不相关

问题描述 投票:0回答:1

我有一个像这样的Python类:

class StreckenLocatorClient():
    def autoCompleteAsync(self, pattern: str, callback: Callable[[list[str]], None]):
        fetcher = QgsNetworkContentFetcher()
        def onFinished():
            reply = json.loads(fetcher.contentAsString())
            theList = list(map(lambda o: str(o["value"]), reply))
            callback(theList)
        fetcher.finished.connect(onFinished)
        request = QNetworkRequest(QUrl("Whatever"))
        fetcher.fetchContent(request)

加载该模块时,我从标题中得到异常。我知道

fetcher
是封闭范围内的自由变量。但是,它在内部函数中使用之前已初始化。另外,根据我对内部作用域和外部作用域的理解,这里不存在命名冲突,所以我应该在这里做什么?

我已经尝试过

None
检查
fetcher
变量。然而,这会导致同样的异常:

def onFinished():
    if fetcher is None:
        return

我可以捕获异常:

def onFinished():
    try:
        fetcher
    except:
        return

然而,这感觉真的不对,特别是因为

fetcher
实际上应该根据我的理解来定义。

我正在使用 PyQGIS,其中

fetcher.finished
是一个信号。

python pyqgis
1个回答
0
投票

这可能是由于语法错误或您尚未将变量设置为全局造成的。

您的新代码

class StreckenLocatorClient():
def autoCompleteAsync(self, pattern: str, callback: Callable[[list[str]], None]):
    fetcher = QgsNetworkContentFetcher()
    global fetcher # IMPORTANT!!
    def onFinished():
        reply = json.loads(fetcher.contentAsString())
        theList = list(map(lambda o: str(o["value"]), reply))
        callback(theList)
    fetcher.finished.connect(onFinished)
    request = QNetworkRequest(QUrl("Whatever"))
    fetcher.fetchContent(request)

任何改变答案的意见都可以:D

© www.soinside.com 2019 - 2024. All rights reserved.