2015-11-16 5 views
0

У меня возникли проблемы с использованием скрученных вместе с 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. Любая идея о том, как это сделать?

ответ

0

Вы правильно определили, что MemoryReactor не предоставляет интерфейс IReactorCore. Правильнее всего было бы внести вклад в реализацию IReactorCore в MemoryReactor, чтобы второй пример работал по желанию. Пожалуйста, откройте билет и сделайте это :).

+0

Спасибо за помощь @glyph. Я новичок во всей концепции интерфейса, поэтому не могли бы вы указать мне на существующий билет или пример, которым я мог бы следовать в качестве руководства? – reubano

+0

Я не могу придумать конкретный билет, но это не сложно; ['IReactorCore'] (https://twistedmatrix.com/documents/15.4.0/api/twisted.internet.interfaces.IReactorCore.html) содержит множество методов и атрибутов, просто добавьте эти атрибуты в' MemoryReactor' (и затем добавьте 'IReactorCore' в строку' @ tools '). Интерфейсы - это просто документированное описание того, какие функции должен иметь конкретный объект. – Glyph

+0

gotcha .... им действительно нужно что-либо делать или я могу просто использовать 'pass' для всех из них? – reubano