You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python自定义Order、OrderBook类订单存储排序及打印问题咨询

问题修复方案

你现有代码存在4个核心问题,逐一修改即可实现需求:

    1. 错误混合使用SortedList和普通sorted()方法:你已经用了支持自动排序的SortedList,后续调用sorted()会把它转成普通Python列表,丢失add方法导致后续提交订单报错
    1. 列表打印时显示对象内存地址:Python打印列表元素时会调用对象的__repr__方法,你只定义了__str__,需要补充__repr__的实现
    1. submit方法没有返回值:你调用print(res1.submit())时,方法默认返回None,所以会打印None
    1. 构造函数使用可变默认参数:__init__(self, bids=[], asks=[])的写法会导致所有OrderBook实例共用同一个买卖盘列表,属于Python常见坑点

修改后完整代码

# 记得补SortedList的导入,原代码缺失该部分
from sortedcontainers import SortedList

class Order:
    def __init__(self, order_type, price, quantity, direction):
        self.order_type = order_type        
        self.price = price
        self.quantity = quantity
        self.direction = direction

    def __str__(self):
        # 自定义打印的订单信息格式,可按需调整
        return f"[{self.direction}] {self.order_type} 价格:{self.price} 数量:{self.quantity}"

    # 补充__repr__实现,和__str__保持一致即可解决列表打印显示地址的问题
    __repr__ = __str__

class OrderBook:
    # 把可变默认参数改为None,内部初始化空列表避免实例数据共用问题
    def __init__(self, bids=None, asks=None):
        bids = bids if bids is not None else []
        asks = asks if asks is not None else []
        # SortedList会自动按指定key维护顺序,不需要手动调用sorted
        self.bids = SortedList(bids, key = lambda order: -order.price)
        self.asks = SortedList(asks, key = lambda order: order.price)

    def submit(self, order):        
        if order.direction == 'buy':
            self.bids.add(order)
            print("当前买盘:", self.bids)
        elif order.direction == 'sell':
            self.asks.add(order)
            print("当前卖盘:", self.asks)
        # 按需返回当前更新后的订单列表
        return self.bids if order.direction == 'buy' else self.asks

    def remove(self, order):
        if order.direction == 'buy':
            self.bids.remove(order)
        elif order.direction == 'sell':
            self.asks.remove(order)

# 测试用例
res1 = OrderBook()
res1.submit(Order("AAPL",70,1,'buy'))
res1.submit(Order("DIS",70,1,'buy'))
res1.submit(Order("DIS",80,1,'buy'))
res1.submit(Order("AAPL",70,1,'sell'))
res1.submit(Order("DIS",15,2,'buy'))
res1.submit(Order("DIS",15,1,'buy'))

# 单独打印全量买盘/卖盘的方法
# print("所有买盘:", res1.bids)
# print("所有卖盘:", res1.asks)

效果说明

运行后会按顺序打印每次提交后的买卖盘列表,订单会按指定规则自动排序,相同价格的订单按插入顺序排列,不会再出现内存地址和None输出。如果需要单独获取当前全量买盘/卖盘数据,直接调用res1.bids、res1.asks即可。

内容的提问来源于stack exchange,提问作者i L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 21:03:01