clients = []    
def disconnect_client ():
        for c in clients:
            c['conn'].close()
        clients = []

У меня есть этот код в Python, но он вызывает эту ошибку, когда я вызываю функцию. Где это пошло не так?

У меня также есть эта функция, и она не вызывает никаких проблем. (он использует переменную клиентов). Пожалуйста, не обращайте внимания на комментарии в моем коде

def start_server ():
    # pornim serverul de socket. parametrii default: AF_INET, SOCK_STREAM, 0
    s = socket.socket()

    # legam portul 8001 de serverul de socket
    s.bind(('', 8001))

    # definim numarul maxim de conexiuni in asteptare
    s.listen(5)
    threading.Thread(target = server_commands).start()
    # facem serverul sa ruleze continuu
    while 1:
        # asteptam o conexiune la server
        # se vor returna 2 valori, un obiect de tip socket (clientul) care se va pune in variabila conn, si adresa clientului care va fi pusa in variabila addr
        conn, addr = s.accept()
        print 'Connection from:', addr
        # punem obiectul intr-un array pentru a tine evidenta
        clients.append({'conn': conn, 'addr': addr})

        # pornim un nou thread pentru fiecare client pentru a putea accepta o noua conexiune
        # ii dam ca parametrii functia cu care va rula si parametrii dati functiei, in acest caz ii pasam obiectul client si adresa sa
        threading.Thread(target = handle, args = (conn, addr)).start()
-2
John 15 Дек 2015 в 22:16

3 ответа

Лучший ответ

Вы пытаетесь выполнить повторную привязку clients, что означает, что Python считает, что это локальная переменная, и поэтому не может видеть глобальную переменную с тем же именем.

Вы можете решить проблему, очистив клиентов внутри вашей функции следующим образом:

clients[:] = []

Изменяет существующий список вместо его повторного связывания.

2
John La Rooy 15 Дек 2015 в 19:27

Если вы действительно хотите, чтобы это запускалось и повторно связывало переменную клиентов, вы можете использовать ключевое слово global:

clients = []    
def disconnect_client ():
    for c in clients:
        c['conn'].close()
    global clients
    clients = []

Но на самом деле было бы гораздо разумнее, как предложил @brito, просто передать его, а затем вернуть:

clients = []    
def disconnect_client (clients):
    for c in clients:
        c['conn'].close()
    clients = []
    return clients

Также я понятия не имею, почему вы используете восемь пробелов для первого отступа.

Интересно, что это немного странная ошибка. Я никогда не видел этого раньше, но я ожидал, что он выдаст ошибку, которая явно проинформирует вас, что вы пытаетесь повторно связать глобальную переменную, в чем проблема - потому что, конечно, функция обычно может найти глобальную переменную, если переменная с данным именем не существует в локальной области видимости; только тогда, когда вы пытаетесь повторно связать его, это вызывает проблемы.

0
Paul Gowder 15 Дек 2015 в 19:37

clients не определен в disconnect_client. Он определен вне области действия функции. Определите его в disnect_client или передайте в качестве аргумента.

0
Leo Brito 15 Дек 2015 в 19:18