我对于javascript中的事件驱动机制非常好奇。如果使用javascript
异步读取文件,可以使用如下代码:
var fs = require('fs');
// 打开一个流:
var rs = fs.createReadStream('sample.txt', 'utf-8');
rs.on('data', function (chunk) {
console.log('DATA:')
console.log(chunk);
});
rs.on('end', function () {
console.log('END');
});
rs.on('error', function (err) {
console.log('ERROR: ' + err);
});
而如果使用python
则代码会是这样:
try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()
我自己尝试使用python
模拟javascript
的写法(不一定是异步,只是想模仿这种风格),但是失败了,运行 fs_test.py
没有任何输出。 自己的代码如下:
events.py
class EventEmitter():
events_dict = {}
# "on" function
def on(self, event, event_handler):
if self.events_dict.get(event) == None:
self.events_dict[event] = [event_handler]
elif not event_handler in self.events_dict[event]:
self.events_dict[event].append(event_handler)
# "emit" function
def emit(self, event):
if self.events_dict.get(event) == None:
pass
else:
for event_handler in self.events_dict[event]:
event_handler(event)
def get_event_handler_length(self, event):
return len(self.events_dict.get(event))
fs.py
from events import EventEmitter
def createReadStream(srcFile, code):
emitter = EventEmitter()
try :
f = open(srcFile, 'r', encoding=code)
data = f.read()
emitter.emit('data')
emitter.emit('end')
except Exception:
emitter.emit('error')
return emitter
fs_test.py
import fs
rs = fs.createReadStream('sample.txt', 'utf-8')
def data(chunk):
print('DATA:')
print(chunk)
def end():
print('END')
def error(error):
print('ERROR: ' + error)
rs.on('data', data)
rs.on('end', end)
rs.on('error', error)
我找了很长时间,没有发现网上有类似的资源。我了解到python
有asyncio
以及twister
等库可以使用,但是现在我并不想真正让其异步,只是单纯想使用python
模拟javascript
的这种编码风格而已。请问我应该怎么做?
如果只要求风格相近的话,有一个折衷的办法:先绑定再执行
events.py
fs.py
test.py