UnboundLocalError: локальная переменная 'fuzzables', на которую ссылаются до назначения

У меня проблема со скриптом Python. Когда я пытаюсь запустить его с некоторыми параметрами, я получаю следующую ошибку:

  print json.dumps(filter(lambda x: x.get('url'), [x.as_dict() for x in fuzzables]), indent=4)
UnboundLocalError: local variable 'fuzzables' referenced before assignment

Я не парень с питоном; Кто-нибудь может мне помочь?

Код:

def main():
    form_stack = []
    parser = argparse.ArgumentParser('crawl')
    parser.add_argument('url', type=str, help='Target URL')
    parser.add_argument('-s', '--strict', action='store_true', help='Strict Mode')
    args = parser.parse_args()

    target = get_final_url(args.url)
    ltarget = [target]

    if args.strict:
        br = Browser(qapp=qapp, scope=ltarget, strict_match=target)
    else:
        br = Browser(qapp=qapp, scope=ltarget)

    br.load(target)

    dom_urls = br.get_history(clear=True, verify=True)
    static_urls = br.urls(verify=True)
    static_urls.extend(dom_urls)
    static_urls = list(set(static_urls))

    already = 0

    for url in static_urls:
        already += 1
        if len(static_urls) >= 128:
            break

        try:
            br.load(url, retries=2)
        except BrowserTimeout, e:
            continue

        form_stack.extend(br.forms())
        temporaries = br.urls(verify=True)

        map(lambda x: static_urls.append(x), temporaries)
        dom_urls = br.get_history(clear=True, verify=True)
        s_urls = br.urls(verify=True)
        s_urls.extend(dom_urls)
        s_urls = list(set(s_urls))
        static_urls.extend(s_urls)
        static_urls = list(set(static_urls))
        static_urls = map(make_dummy_url, static_urls)
        fuzzables, hashsums = [], []

        for form in form_stack:
            if form['hashsum'] in hashsums:
                continue
            else:
                hashsums.append(form['hashsum'])

            method = form.get('method', 'POST')
            action = form.get('action', '')
            headers = form.get('headers')
            cookies = form.get('cookies')
            data = unquote(urlencode(form.get('fields', {})))
            action = action.toString() if type(action) != str else action

            if type(data) == str and "__PAYLOAD__" not in data:
                data = parse_qsl(data)
                [data.update(set_payload(x)) for x in data.keys()]
                data = unquote(urlencode(data))

            method = method.upper()
            vhost = urlparse(action).hostname
            fuzzable = Fuzzable(method, action, data, cookies, headers, vhost)
            fuzzables.append(fuzzable)

        for url in static_urls:
            url = url.toString() if type(url) != str else url
            uu = urlparse(url)
            qsl = urlparse(url)
            qsl = parse_qsl(uu.query)

            [qsl.update(set_payload(x)) for x in qsl.keys()]
            qsl = urlencode(qsl)

            qq = "?%s" %qsl
            qq = "" if qq == "?" else qq
            url = "%s://%s%s%s" %(uu.scheme, uu.netloc, uu.path, qq)

            if "__PAYLOAD__" not in url:
                continue

            cookies = br.get_plain_cookies()
            vhost = urlparse(url).hostname
            fields = ""
            headers = {}
            fuzzable = Fuzzable("GET", url, fields, cookies, headers, vhost)
            fuzzables.append(fuzzable)

    """
    fu = urlparse(target)
    path = fu.path
    query = parse_qsl(fu.query)
    [query.update(set_payload(x)) for x in query.keys()]
    query = unquote(urlencode(query))
    rqury = "?%s" %query
    rqury = "" if rqury == "?" else rqury
    temporary_url = "%s://%s%s%s" %(fu.scheme, fu.netloc, path, rqury)
    fields = ""
    cookies = br.get_plain_cookies()
    vhost = urlparse(target).hostname
    headers = {'host': fu.hostname}
    fuzzable = Fuzzable("GET", temporary_url, fields, cookies, headers, vhost)
    fuzzables.append(fuzzable)
    """

    br.close()
    del br

    print json.dumps(filter(lambda x: x.get('url'), [x.as_dict() for x in fuzzables]), indent=4)

3 ответа

Учитывая сценарий, связанный в комментариях, если static_urls является пустым списком, то назначение fuzzables, поэтому переменная не определена при обращении.

Вы могли бы переместить fuzzables = [] назначение за пределами static_urls петля.

fuzzables присваивается только в цикле:

for url in static_urls:
    # ...
    if len(static_urls) >= 128:
        break

    # ...

    fuzzables, hashsums = [], []

Если static_urls пуст или содержит более 128 элементов, строка назначения никогда не достигается, и fuzzables остается свободным

Назначьте что-то fuzzables вне этого цикла, если вы хотите гарантировать, что он связан.

Взглянув на этот код, вы, вероятно, не хотите создавать новый, пустой fuzzables для каждого static_urls запись либо.

Кажется, сообщение об ошибке указывает на проблему. Вам нужно назначить что-то fuzzables прежде чем использовать его.

Например:

fuzzables = #something
Другие вопросы по тегам