nonebot / aiocqhttp

A Python SDK with async I/O for CQHTTP (OneBot).
https://aiocqhttp.nonebot.dev
MIT License
280 stars 39 forks source link

MessageSegment 加法會使變量被改變 #51

Open cleoold opened 3 years ago

cleoold commented 3 years ago

问题描述 title

复现方法 Paste code below

期望的行为

日志信息 ...

相关代码

In [19]: msg1=MessageSegment.text('seg1')

In [20]: msg2=MessageSegment.text('seg2')

In [21]: msg1 + msg2
Out[21]: [{'type': 'text', 'data': {'text': 'seg1seg2'}}]

In [22]: msg1
Out[22]: {'type': 'text', 'data': {'text': 'seg1seg2'}}  # changed

In [23]: msg2
Out[23]: {'type': 'text', 'data': {'text': 'seg2'}}

In [24]:

运行环境

MessageSegment 因爲繼承了 dict,所以是可變類型。不過對於這個問題還要討論,歡迎給出建議。

stdrc commented 3 years ago

居然还有这问题

似乎应该在 Message.__init__ 里面 extendappend 的时候做深拷贝

stdrc commented 3 years ago

主要问题在于 Message.reduce 会合并 text 消息段,而 MessageSegment 又直接 append 到了 Message 的里,没有拷贝