将附加参数传递给只需要 1 个的回调对象
Passing additional arguments to a callback object that only takes 1
所以我正在做一个小项目,我正在使用 websocket 客户端库,为了创建一个 WebSocketApp
对象来处理 websocket 连接,你用类似
的东西实例化该对象
ws = websocket.WebSocketApp(uri, on_open=on_open, on_message=on_message, on_ping=on_ping)
现在我有一个名为 on_message
的函数,它是处理传入消息的回调函数(对象?),或者更确切地说如何处理它们,并由 ws
调用当收到完整消息时(显然),我创建的对象。 on_message
定义为实例化WebSocketApp
对象时的回调。
on_message 是这样的
def on_message(ws, message):
print(message)
我想要的是这样的:
def on_message(ws, message, someList)
somelist.append(message)
我当然可以使用一个全局变量来引用我想更新的对象(在这个例子中是一个列表)但是这似乎不是正确的方法,如果我能通过就更好了在初始化 WebSocketApp
对象时对我要更新的对象的引用,类似于:
ws = websock.WebSocketApp(uri, on_message=on_message(ref_to_Obj), on_open=on_open, on_close=on_close)
但显然这不起作用,因为我收到 TypeError: on_message() missing 2 required positional arguments: 'message' and objRef'
错误。
我不太确定如何处理这个问题。 Subclassing 浮现在脑海中,但也不确定我将如何以这种方式完成它。查看 WebSocketApp
的源代码,它说它有 2 个参数,1) WebSocketApp
class 本身和 2) 从服务器接收的 utf-8 数据。我从不传递这些,我假设库在创建它们时只是将这些引用传递出去,但我如何重载它以包含额外的参数?首先想到的是使用 *args 或 **kwargs 超载,但又不确定如何实现它。我之前问过并建议使用 lambda 函数,但我也不知道如何让它工作。
您想 "partially apply" the function. That can be done using partial
:
from functools import partial
ws = websock.WebSocketApp(uri, on_message=partial(on_message, someList=ref_to_Obj))
partial
接受一个函数和参数(我在这里使用关键字参数),returns 一个 new 部分应用的函数信息已经传递。
这个“穷人的”版本将只使用 lambda
:
ws = websock.WebSocketApp(uri, on_message=lambda ws, msg: on_message(ws, msg, ref_to_Obj))
partial
应该是首选,因为它保留了原始函数的元数据,这很有用。
所以我正在做一个小项目,我正在使用 websocket 客户端库,为了创建一个 WebSocketApp
对象来处理 websocket 连接,你用类似
ws = websocket.WebSocketApp(uri, on_open=on_open, on_message=on_message, on_ping=on_ping)
现在我有一个名为 on_message
的函数,它是处理传入消息的回调函数(对象?),或者更确切地说如何处理它们,并由 ws
调用当收到完整消息时(显然),我创建的对象。 on_message
定义为实例化WebSocketApp
对象时的回调。
on_message 是这样的
def on_message(ws, message):
print(message)
我想要的是这样的:
def on_message(ws, message, someList)
somelist.append(message)
我当然可以使用一个全局变量来引用我想更新的对象(在这个例子中是一个列表)但是这似乎不是正确的方法,如果我能通过就更好了在初始化 WebSocketApp
对象时对我要更新的对象的引用,类似于:
ws = websock.WebSocketApp(uri, on_message=on_message(ref_to_Obj), on_open=on_open, on_close=on_close)
但显然这不起作用,因为我收到 TypeError: on_message() missing 2 required positional arguments: 'message' and objRef'
错误。
我不太确定如何处理这个问题。 Subclassing 浮现在脑海中,但也不确定我将如何以这种方式完成它。查看 WebSocketApp
的源代码,它说它有 2 个参数,1) WebSocketApp
class 本身和 2) 从服务器接收的 utf-8 数据。我从不传递这些,我假设库在创建它们时只是将这些引用传递出去,但我如何重载它以包含额外的参数?首先想到的是使用 *args 或 **kwargs 超载,但又不确定如何实现它。我之前问过并建议使用 lambda 函数,但我也不知道如何让它工作。
您想 "partially apply" the function. That can be done using partial
:
from functools import partial
ws = websock.WebSocketApp(uri, on_message=partial(on_message, someList=ref_to_Obj))
partial
接受一个函数和参数(我在这里使用关键字参数),returns 一个 new 部分应用的函数信息已经传递。
这个“穷人的”版本将只使用 lambda
:
ws = websock.WebSocketApp(uri, on_message=lambda ws, msg: on_message(ws, msg, ref_to_Obj))
partial
应该是首选,因为它保留了原始函数的元数据,这很有用。