Подсказка типа Python 3.5 дает AttributeError: модуль «iterator_function» не имеет атрибута «IteratorFunction»

Когда я пытаюсь ввести подсказку для своего пользовательского класса, python выдает AttributeError на «module.class». Intellisence говорит мне, что импорт правильный, и класс можно найти.

function_dispatcher.py, в этом файле происходит ошибка : iterator_function.IteratorFunction. Когда я удалю подсказку определенного типа, программа будет работать нормально.

from abc import ABC, abstractclassmethod
import iterator_function

class FunctionDispatcher(ABC):
    @abstractclassmethod
    def dispatch(self, function : iterator_function.IteratorFunction):
        pass

iterator_function.py, это импортированный класс. Примечание: здесь работает тип, намекающий на : function_dispatcher.FunctionDispatcher.

import function
import function_dispatcher

class IteratorFunction(function.Function):
    def accept(self, dispatcher : function_dispatcher.FunctionDispatcher):
        dispatcher.dispatch(self)

Это вывод трассировки:

1>  Traceback (most recent call last):
1>    File "C:\Users\admin\Documents\visual studio 2015\Projects\Preprocessor\Program\preprocessor\main.py", line 1, in <module>
1>      import generator
1>    File "C:\Users\admin\Documents\visual studio 2015\Projects\Preprocessor\Program\preprocessor\generator.py", line 3, in <module>
1>      from iterator_function import IteratorFunction
1>    File "C:\Users\admin\Documents\visual studio 2015\Projects\Preprocessor\Program\preprocessor\iterator_function.py", line 1, in <module>
1>      import function
1>    File "C:\Users\admin\Documents\visual studio 2015\Projects\Preprocessor\Program\preprocessor\function.py", line 2, in <module>
1>      import function_dispatcher
1>    File "C:\Users\admin\Documents\visual studio 2015\Projects\Preprocessor\Program\preprocessor\function_dispatcher.py", line 4, in <module>
1>      class FunctionDispatcher(ABC):
1>    File "C:\Users\admin\Documents\visual studio 2015\Projects\Preprocessor\Program\preprocessor\function_dispatcher.py", line 6, in FunctionDispatcher
1>      def dispatch(self, function : iterator_function.IteratorFunction):
1>  AttributeError: module 'iterator_function' has no attribute 'IteratorFunction'

Для тех, кому интересно, что я пытаюсь сделать: реализовать шаблон посетителя.


person oddRaven    schedule 27.12.2016    source источник
comment
похоже, у вас есть циклический импорт.   -  person hiro protagonist    schedule 27.12.2016


Ответы (1)


hiro главный герой был прав. Мне удалось решить круговой импорт и поддерживать проверку типов. Это не так чисто, но это делает работу.

функция.py

from abc import ABC, abstractmethod

class Function(ABC):
    def __init__(self, arguments, min_arguments):
        self.arguments = arguments
        self.min_arguments = min_arguments if len(arguments) < min_arguments else len(arguments)

    @abstractmethod
    def accept(self, dispatcher):
        pass

    def test_dispatcher(self, dispatcher):
        import function_dispatcher
        if not isinstance(dispatcher, function_dispatcher.FunctionDispatcher):
            raise Exception("Not of type FunctionDispatcher")

iterator_function.py

import function

class IteratorFunction(function.Function):
    def accept(self, dispatcher):
        self.test_dispatcher(dispatcher)
        dispatcher.dispatch(self)
person oddRaven    schedule 27.12.2016