Использование twisted in doctest

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


person reubano    schedule 16.11.2015    source источник


Ответы (1)


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

person Glyph    schedule 17.11.2015
comment
Спасибо за помощь @glyph. Я новичок во всей концепции интерфейса, не могли бы вы указать мне на существующий тикет или пример, которому я мог бы следовать в качестве руководства? - person reubano; 17.11.2015
comment
Я не могу придумать конкретный билет, но это несложно; IReactorCore имеет множество методов и атрибутов. просто добавьте эти атрибуты в MemoryReactor (а затем добавьте IReactorCore в строку @implements). Интерфейсы - это просто документированное описание того, какими функциями должен обладать конкретный объект. - person Glyph; 18.11.2015
comment
Попался .... им на самом деле нужно что-то делать, или я могу просто использовать pass для всех? - person reubano; 19.11.2015
comment
Итак, отправлено исправление, и тесты проходят, так что я думаю, все в порядке :). - person reubano; 19.11.2015
comment
Большое спасибо за ваш вклад, мы обсудим дальше по тикету! - person Glyph; 20.11.2015