У меня возникли проблемы с использованием скрученных вместе с doctest
. Я пытаюсь open a file так:Использование скрученного в doctest
from __future__ import print_function
from twisted.internet.defer import Deferred
from twisted.internet.fdesc import readFromFD, setNonBlocking
from twisted.internet.task import react
def asyncFunc(filename):
"""Description.
Examples:
>>> def run(reactor, filename):
... d = asyncFunc(filename)
... return d.addCallback(print)
>>>
>>> try:
... react(run, ['hello.txt'])
... except SystemExit:
... pass
hello world
<BLANKLINE>
"""
with open(filename) as f:
d = Deferred()
fd = f.fileno()
setNonBlocking(fd)
readFromFD(fd, d.callback)
return d
Он отлично работает только с одним испытанием, но для более чем одного я получаю ошибку ReactorNotRestartable
.
def anotherAsyncFunc(filename):
"""Description.
Examples:
>>> def run(reactor, filename):
... d = anotherAsyncFunc(filename)
... return d.addCallback(print)
>>>
>>> try:
... react(run, ['hello.txt'])
... except SystemExit:
... pass
hello world
<BLANKLINE>
"""
with open(filename) as f:
d = Deferred()
fd = f.fileno()
setNonBlocking(fd)
readFromFD(fd, d.callback)
return d
Затем я прочитал о MemoryReactor
и попытался это:
def anotherAsyncFunc(filename):
"""Description.
Examples:
>>> from twisted.test.proto_helpers import MemoryReactor
>>> reactor = MemoryReactor()
>>>
>>> def run(reactor, filename):
... d = anotherAsyncFunc(filename)
... return d.addCallback(print)
>>>
>>> try:
... react(run, ['hello.txt'], reactor)
... except SystemExit:
... pass
hello world
<BLANKLINE>
"""
with open(filename) as f:
d = Deferred()
fd = f.fileno()
setNonBlocking(fd)
readFromFD(fd, d.callback)
return d
Но это дает мне 'MemoryReactor' object has no attribute 'addSystemEventTrigger'
AttributeError
. Любая идея о том, как это сделать?
Спасибо за помощь @glyph. Я новичок во всей концепции интерфейса, поэтому не могли бы вы указать мне на существующий билет или пример, которым я мог бы следовать в качестве руководства? – reubano
Я не могу придумать конкретный билет, но это не сложно; ['IReactorCore'] (https://twistedmatrix.com/documents/15.4.0/api/twisted.internet.interfaces.IReactorCore.html) содержит множество методов и атрибутов, просто добавьте эти атрибуты в' MemoryReactor' (и затем добавьте 'IReactorCore' в строку' @ tools '). Интерфейсы - это просто документированное описание того, какие функции должен иметь конкретный объект. – Glyph
gotcha .... им действительно нужно что-либо делать или я могу просто использовать 'pass' для всех из них? – reubano