【发布时间】:2022-06-17 23:36:21
【问题描述】:
我正在尝试编写一个 Python 程序,它使用 websocket 从加密货币交易所(Binance、Kraken 等)获取市场流数据
目前,我有一个Exchange 类如下:
class Exchange(threading.Thread):
def __init__(self, url):
super().__init__()
self.web_socket = websocket.WebSocketApp(
url = url,
on_open = self.on_open,
on_message = self.on_message,
on_error = self.on_error,
on_close = self.on_close
)
def on_open(self):
pass
def on_message(self, message):
pass
def on_error(self, error):
pass
def on_close(self):
pass
def run(self):
while True:
self.web_socket.run_forever()
我还有其他几个类Binance、Kraken等等,它们继承自Exchange。他们有自己的上述方法的实现。例如:
class Binance(Exchange):
def __init__(self, url):
super().__init__(url)
def on_message(self, message):
data = loads(message)
ticker, price = data['s'][:3].lower(), data['p']
print(f'{ticker}: ${price}')
我的“main.py”文件:
binance_streams = 'btcusdt@trade/ethusdt@trade'
binance_url = 'wss://stream.binance.com:9443/stream?streams={binance_streams}'
binance_client = Binance(binance_url)
binance_client.start()
运行后,它应该开始打印如下语句:
btc: $47950
eth: $3500
eth: $3501
btc: $47951
etc...
但是,我得到了所有 Exchange 方法的 TypeError,例如:
Exchange.on_open() 接受 1 个位置参数,但给出了 2 个 Exchange.on_error() 接受 2 个位置参数,但给出了 3 个
我在 StackOverflow 上搜索了解决方案,似乎大多数错误与方法定义中未提供 self 有关。
我已经三次检查了我的代码,并确保在我的所有方法定义中确实提供了 self,但是我仍然收到此错误。
如果有任何帮助,我将不胜感激!谢谢。
【问题讨论】:
-
方法调用有附加参数,但方法定义没有匹配的参数。阅读“websocket.WebSocketApp”的文档,了解函数应该有哪些附加参数。
-
嗨,迈克尔,感谢您的回复。我找到并查看了 websocket/_app.py 文档。看来我的 on_close 缺少 2 个参数。我现在添加了它们 - def on_close(self, close_status_code, close_msg)。但是,同样的错误仍然存在。你能看看有什么遗漏吗?
-
我忘了提到 e。 G。 “self.on_open”是所谓的“绑定方法”。这意味着它绑定到对象“self”,并在调用时自动将其作为第一个参数添加。所以“self.on_open(a)”大致翻译为“Exchange.on_open(self, a)”。因此,您还必须为函数中缺少的参数添加参数。
-
在 websocket/_app.py 文档中,它说 on_open 有一个参数是“此类对象”。这个类对象的意思是“自我”对吧?我的方法定义是 on_open(self)。还是“this class object”不等于“self”?我是不是误会了?
-
它不能引用“self”,因为“WebSocketApp”甚至不知道构造函数是否接收绑定方法(带有“self”)或没有的简单函数。 “类对象”是指“WebSocketApp”对象。