【问题标题】:Still getting TypeError: .method takes (x) positional arguments but (x+1) were given, even though I have self in method definition即使我在方法定义中有 self
【发布时间】: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()

我还有其他几个类BinanceKraken等等,它们继承自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”对象。

标签: python websocket


【解决方案1】:

您已按照您在上一篇文章中所说的那样修复了它,但没有共享任何代码。我遇到同样的问题,您介意分享解决方案吗?

【讨论】:

  • Bob hhhuh,请不要添加 Me too 作为答案。它实际上并没有提供问题的答案。如果你有一个不同但相关的问题,那么ask它(如果它有助于提供上下文,请参考这个问题)。如果您对这个特定问题感兴趣,您可以upvote 它,留下comment,或者在您有足够的reputation 时开始bounty
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 2018-06-28
相关资源
最近更新 更多