@Midzakikayo

Как исправить AttributeError: 'Client' object has no attribute '_sock'?

Всем добра! Прошу совета! Прохожу обучение по Python. Встрял на задании и не могу понять что не так...
По заданию должен написать клиент принимающий и отправляющий данные с метрикой. На тесте клиент работает. Но грабер вываливается с ошибкой об отсутствии атрибута _sock хотя такой атрибут имеется. Конечно код мой написан безобразно...( Но тем не менее, если можете подскажите в чем дело и если возможно, то не давайте прямого решения. Заранее огромное спасибо!!
####Import List####
import time
import socket
import argparse
####DEF LIST####
def parses():  # Ignore. For next real.
    parser = argparse.ArgumentParser(description="Work functional Client.\nOn console")
    parser.add_argument('put', 'put', type=str, help='add on server')
    parser.add_argument('put', 'put', type=str, help='download from server')
    args = parser.parse_args()
    return args

def check_return(data, requests):
    data_dict = {'*': {}}
    for i in range(1, len(data), 3):
        try:
            data_dict['*'][data[i]] = (float(data[i + 1]), int(data[i + 2]))
        except ClientError:
            return "error"
    try:
        if requests == '*':
            return f"{data[0]}\n{data_dict['*']}"
        else:
            res = {requests: [data_dict['*'][requests]]}
            return f"{data[0]}\n{res}"
    except KeyError:
        return data[0] + "\nНе верный запрос. Или не получен ответ."

####CLASS LIST####
class ClientError(Exception):
    pass

# Connect client
class Client:
    _sock = None

    def __init__(self, ip, port, timeout=None):
        if isinstance(ip, str) and isinstance(port, int):
            self._ip = ip
            self._port = port
            print(ip, port)
            Client._sock = socket.create_connection((str(ip), port))
            Client._sock.settimeout(timeout)

    # Load on server
    @staticmethod
    def put(server_name, load=None, timestamp=int(time.time())):
        data = []
        for i in [server_name, load, timestamp]:
            if i is None:
                continue
            else:
                data.append(i)
        Client._sock.sendall(data.encode('utf8'))

    # Get data server
    @staticmethod
    def get(requests):
        while True:
            Client._sock.sendall(requests.encode('utf8'))
            Client._sock.settimeout(1)
            data = Client._sock.recv(1024)
            if data is None:
                return {}
            data = data.decode('utf8').split()
            return check_return(data, requests)

if __name__ == '__main__':
    cl = Client('127.0.0.1', 8888, 1)
    print(cl.get('palm.cpu'))

Сервер на котором проверял:
spoiler
# реализация сервера для тестирования метода get по заданию - Клиент для отправки метрик
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket

sock = socket.socket()
sock.bind(('127.0.0.1', 8888))
sock.listen(1)
conn, addr = sock.accept()

print('Соединение установлено:', addr)

# переменная response хранит строку возвращаемую сервером, если вам для
# тестирования клиента необходим другой ответ, измените ее
response = b'ok\npalm.cpu 10.5 1501864247\neardrum.cpu 15.3 1501864259\n\n'

while True:
    data = conn.recv(1024)
    if not data:
        break
    request = data.decode('utf-8')
    print(f'Получен запрос: {ascii(request)}')
    print(f'Отправлен ответ {ascii(response.decode("utf-8"))}')
    conn.send(response)

conn.close()
  • Вопрос задан
  • 300 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы