vn.py量化社区
By Traders, For Traders.
Member
avatar
加入于:
帖子: 10
声望: 0

eventEngine.py文件中
def __process(self, event):
"""处理事件"""

    # 检查是否存在对该事件进行监听的处理函数
    if event.type_ in self.__handlers:

        [handler(event) for handler in self.__handlers[event.type_]]

        # 以上语句为Python列表解析方式的写法,对应的常规循环写法为:
        #for handler in self.__handlers[event.type_]:
            #handler(event) 

对于常规循环写法中的第二句handler(event) 该怎么理解?
handler()既不是内置函数,也不是自定义函数?
handler(event) 这句话是怎么理解的?怎么执行的?
问题可能比较低级,懂得帮忙解答一下,感谢。

Member
avatar
加入于:
帖子: 526
声望: 24

可参考https://www.vnpy.com/forum/topic/2532-zai-event-engine-pyzhong-dui-shi-jian-event-de-chu-li-han-shu-processzhong-de-handler-event-zhe-ge-han-shu-zuo-liao-shi-yao-chu-li
https://www.vnpy.com/forum/topic/60-vnpy-jiao-yi-suo-fan-hui-wei-tuo-he-jiao-yi-zhuang-tai-dao-ce-lue-de-yuan-dai-ma-fen-xi

Member
avatar
加入于:
帖子: 10
声望: 0

首先非常感谢大佬的解答。
我看了大佬推荐的帖子,主要讲解了handler(event)实现了什么功能。
我这里的疑问主要是从语法上怎么理解handler(event)?
[handler(event) for handler in self.handlers[event.type_]]
这个写法是列表解析的写法,好像是3.7版本以后引入的。(也可能是更早的版本)
但是最原始的写法应该是
for handler in self.
handlers[event.type_]:
handler(event)
for语句就很常规,没有疑问。
但是handler(event) 这个语法上怎么理解?因为handler()不是自定义函数,不是内置函数,也不是关键字。
我在源代码中找不到哪里定义了handler()???

只有在 register函数中有handler。如下:
def register(self, type: str, handler: HandlerType) -> None:
"""
Register a new handler function for a specific event type. Every
function can only be registered once for each event type.
"""
handler_list = self._handlers[type]
if handler not in handler_list:
handler_list.append(handler)
但是register函数中的handler 只是一个形参,或者说是一个临时变量。

那么 在def _process(self, event: Event) -> None:函数中
[handler(event) for handler in self._handlers[event.type]]

handler(event) 它不是函数,handler()也找不到定义,
如果你写一个put(event)(我们先不研究功能对不对),我从语法上可以理解,put是一个函数。

但是handler(event) 我主要是从语法上搞不明白,为啥handler(event)这样写?它能动作,能执行吗?找不到定义
从python的原始语法上找不到类似的写法和说明?
这也是为啥我说问题可能比较低级,各位不要笑话。

Member
avatar
加入于:
帖子: 526
声望: 24

第一个帖子里有说,handler是一个回调函数

Member
avatar
加入于:
帖子: 10
声望: 0

大佬,感谢回复。
我确实看到第一个帖子里面说是一个回调函数.
问题是这个回调函数在哪里定义的?还是第三方库里面的?一直找不到。
比如:
HandlerType = Callable[[Event], None]
这个函数的 Callable[]是typing库里面的,文件开头也导入了,我能可以找到。
但是handler是一个回调函数,它在哪里定义的呢?

如果是个自定义函数,总得先定义,再使用吧?
如果是第三方库或者其他文件夹里面的,那也要先导入,再使用吧?
大佬勿笑,我就是找不到这个handler的原始定义在哪里?
如果是函数的话,帮忙看一下,原始定义在哪个文件下面的哪个位置定义的,多谢。

Member
avatar
加入于:
帖子: 10
声望: 0

大佬,能不能释疑一下?

Member
avatar
加入于:
帖子: 526
声望: 24

handler是python内置的标准模块logging模块下的吧

Member
avatar
加入于:
帖子: 10
声望: 0

第一:如果如大佬所说 handler是python内置的标准模块logging模块下的函数,
那么在使用的时候logging必须导入才行,但是文件开头没有导入啊?
"""
Event-driven framework of vn.py framework.
"""

from collections import defaultdict
from queue import Empty, Queue
from threading import Thread
from time import sleep
from typing import Any, Callable, List

EVENT_TIMER = "eTimer"
上述并没有导入logging

第二:python内置的标准模块logging模块 我查看了自带手册。
有这样一个函数handle(self, record)

但是我疑问的代码中是handler(event) ,与上面自带的handle(self, record)它不一样啊,
一个是handler(),一个是handle(),少一个字母都不是同一个东西啊?况且这个库还没导入啊?

所以大佬的这个答复,本身都比较矛盾啊?

Member
avatar
加入于:
帖子: 186
声望: 22

handler是由其他engine添加的,你可以看看main_engine这些,里面有一些process函数,这些就是被注册进去的句柄(handler)

Member
avatar
加入于:
帖子: 10
声望: 0

方大佬,你的解释是从功能上给我解答了,是有道理的。但是能不能从语法上说明一下?
handler()这玩意是个函数?handler(event)是个函数的实例化?
还是说句柄(handler)这个东西是个全局变量?
我主要是语法没看明白。

比如定义一个列表,向里面添加一个元素,语法规定如下:
list1=[]
list1.append('c')
python就是这么规定的,没啥疑问。

可是那个handler(event),这语法上是啥?
handler是个函数?字典?可是在哪里定义的呢?

© 2015-2019 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号-3