【问题标题】:Error when I call a method within a python class当我在 python 类中调用方法时出错
【发布时间】:2021-06-09 03:09:12
【问题描述】:

当我运行下面的代码时,我得到一个 NameError ,表明 bbo 没有定义。

from typing import Tuple
import requests
import os

class Level:

    __slots__ = ['price', 'amount']

    def __init__(self, price: float, amount: float):
        self.price = price
        self.amount = amount

    def initialize(trading_pair: str):
        pass

    def bbo(trading_pair: str) -> Tuple:
        endpt = "https://api.binance.com"
        api = "/api/v3/depth"
        response = requests.get(endpt + api + trading_pair)
        bids_str, asks_str = response.json()["bids"], response.json()["asks"]
        bids = [[float(x) for x in row] for row in bids_str]
        asks = [[float(x) for x in row] for row in asks_str]
        return (Level(max(bids)[0],max(bids)[1]), Level(min(asks)[0],min(asks)[1]))

    def main(trading_pair: str):
        while True:
            time.sleep(5)
            bb, ba = bbo(trading_pair)
            print(f"Best Bid: {bb.amount}@{bb.price}  Best Ask: {ba.amount}@{ba.price}")

    if __name__=='__main__':
        trading_pair = os.getenv("TRADING_PAIR", "BTCUSDT")
        initialize(trading_pair)
        main(trading_pair)

当我将 self 添加到 main()

def main(self, trading_pair: str):
        while True:
            time.sleep(1)
            bb, ba = self.bbo(trading_pair)
            print(f"Best Bid: {bb.amount}@{bb.price}  Best Ask: {ba.amount}@{ba.price}")

我收到一个 TypeError,说 main() 缺少 1 个必需的位置参数:“trading_pair”。我该如何解决这个问题?

【问题讨论】:

  • 您需要在方法中添加self 作为第一个参数。
  • 当我这样做时,我得到 TypeError missing 1 required positional argument: 'traiding_pair' for my all methods
  • 我不是指main函数;但是对于 Level 类中的方法。也就是说,我不完全确定您要做什么。我认为您可以做的一个选择是将def bbo(...) 作为静态方法。
  • initialize(trading_pair) 调用的目的是什么?
  • 目前初始化方法什么都不做。我保留它以防万一我需要初始化某些东西。当我在终端上运行这个脚本时,它可以完美运行,直到 main() 方法中的 bbo() 调用。

标签: python-3.x oop


【解决方案1】:

您遇到了几个问题,即使您已将其包括在内 self 方法中的参数。

首先,您的__main__ 电话:

    trading_pair = os.getenv("TRADING_PAIR", "BTCUSDT")
    initialize(trading_pair)
    main(trading_pair)

这是行不通的,因为initialize 应该是Level 类中的一个方法。所以你会在initialize 中得到一个未声明的变量。但由于它现在什么都不做,我只是猜测你会用它来做一些初始化。稍后会谈到这个。

bbo 的主要方法似乎是(因为没有更好的词)实际的初始化程序,所以我将专注于此。

这是我对您的代码的看法:

from typing import Tuple
import requests
import os
import time

class Level:

    __slots__ = ['price', 'amount']

    def __init__(self, price: float, amount: float):
        self.price = price
        self.amount = amount

    def initialize(self, trading_pair: str):
        pass

    @staticmethod
    def bbo(trading_pair: str) -> Tuple:
        endpt = "https://api.binance.com"
        api = "/api/v3/depth"
        response = requests.get(endpt + api + trading_pair)
        bids_str, asks_str = response.json()["bids"], response.json()["asks"]
        bids = [[float(x) for x in row] for row in bids_str]
        asks = [[float(x) for x in row] for row in asks_str]
        return (Level(max(bids)[0],max(bids)[1]), 
                Level(min(asks)[0],min(asks)[1]))


def main(trading_pair: str):
    while True:
        time.sleep(5)
        bb, ba = Level.bbo(trading_pair)
        print(f"Best Bid: {bb.amount}@{bb.price}  Best Ask: {ba.amount}@{ba.price}")

if __name__=='__main__':
    trading_pair = os.getenv("TRADING_PAIR", "BTCUSDT")
    main(trading_pair)

您的 initialize 方法什么都不做,但如果它只是一个 占位符以备将来使用,我将保留它。然而, 你需要记住,如果你确实需要使用它, 你需要把它放在你已经实例化的地方 Level 类。类似于(但是 不完全是,因为我不知道initialize 是什么 会做):

    @staticmethod
    def bbo(self, trading_pair: str) -> Tuple:
        endpt = "https://api.binance.com"
        api = "/api/v3/depth"
        response = requests.get(endpt + api + trading_pair)
        bids_str, asks_str = response.json()["bids"], response.json()["asks"]
        bids = [[float(x) for x in row] for row in bids_str]
        asks = [[float(x) for x in row] for row in asks_str]
        bid_level = Level(max(bids)[0],max(bids)[1])
        ask_level = Level(min(asks)[0],min(asks)[1])
        bid_level.initialize(trading_pair)
        ask_level.initialize(trading_pair)
        return (bid_level,  ask_level)

也就是说,您还需要包括错误检查 以防 response.json() 最终无效, 或响应无效。 (同样,只是一个建议)。

我已经测试了代码,但遇到 404 错误,所以我 不确定网址是否正确或我遗漏了一些 凭据。

【讨论】:

  • 请发布完整的回溯。我没有收到那个错误。
  • 我终于让它工作了。非常感谢@ewong。
猜你喜欢
  • 1970-01-01
  • 2018-03-16
  • 2017-09-21
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-28
  • 2015-11-21
相关资源
最近更新 更多