Всем добра! Прошу совета! Прохожу обучение по 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()