ошибка "недостаточно аргументов задано" при установке функции класса в качестве обратного вызова - PullRequest
0 голосов
/ 01 февраля 2019

Я новичок в питоне.Ниже приведен мой код.Я получаю эту ошибку при создании экземпляра своего класса.

ошибка обратного вызова>: on_open () принимает ровно 2 аргумента (1 дано)

Тот же код работает нормально, если я делаю все это вне класса, прямо в главном файле.Я думаю, что это как-то связано с «я» (атрибут?).Но подобный код на стороне сервера работает нормально.Я использую пакет web-socket-client !и следуя примеру Долгоживущее соединение , показанное там.

Это библиотека !Я использую для серверной стороны, который имеет очень похожий интерфейс с клиентской библиотекой.

Код серверной стороны

from websocket_server import WebsocketServer

def client_connected(client, server):
    print "connected:"
    print client

def client_disconnected(client, server):
    print "Disconnected:"
    print client

def message_received(client, server, message):
    server.send_message(client, message)
    print "message received: ", message
    print client

server = WebsocketServer(13254, host='127.0.0.1')
server.set_fn_new_client(client_connected)
server.set_fn_client_left(client_disconnected)
server.set_fn_message_received(message_received)
server.run_forever()

Код клиентской стороны, которыйработает.

import websocket
from multiprocessing import Lock
import copy
import json
import time
import thread

txMsg = "hello world"
def on_message(ws, message):
    print message

def on_error(ws, error):
    print error

def on_close(ws):
    print "### closed ###"

def on_open(ws):
    def run():
        for i in range(1):
            time.sleep(1)
            print txMsg
            ws.send(txMsg)
        time.sleep(1)
        ws.close()
        print "thread terminating..."
    thread.start_new_thread(run, ())


if __name__ == "__main__":
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp("ws://127.0.0.1:13254",
                                on_message = on_message,
                                on_error = on_error,
                                on_close = on_close,
                        on_open = on_open)
    ws.run_forever()

код на стороне клиента, выдающий ошибку

import websocket

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

class Client:
    __metaclass__ = Singleton

    serverAddress = None
    serverPort = None
    socket = None

    def __init__(self, serverAddress, serverPort):
        self.serverAddress= serverAddress
        self.serverPort = serverPort
        websocket.enableTrace(True)
        self.socket = websocket.WebSocketApp("ws://"+ serverAddress +":"+str(serverPort),
                            on_message = self.on_message,
                          on_error = self.on_error,
                          on_close = self.on_close,
                          on_open = self.on_open)


# Callbacks------------------------------------------------------------------

    def on_open(self, ws):
        print "***Connection Opened***"
        self.close()
    def on_close(self, ws):
        print "***Connection Closed***"
    def on_message(self, ws, message):
        print "Message: ", message
        self.socket.close()
    def on_error(self, ws, error):
        print "Error: ", error

# API------------------------------------------------------------------

    def close(self):
        self.socket.close()

client = Client('127.0.0.1', 13254)
client.socket.run_forever()

1 Ответ

0 голосов
/ 04 февраля 2019

В исходном коде клиентской библиотеки перейдите к «_app.py».В функции "_callback" класса "WebSocketApp" (строка 339 на момент написания этого ответа) измените

if inspect.ismethod(callback):

на

if not inspect.ismethod(callback):
...