Python 3.5 type hinting gives "AttributeError: module 'iterator_function' has no attribute 'IteratorFunction'"
Python 3.5 type hinting gives "AttributeError: module 'iterator_function' has no attribute 'IteratorFunction'"
当我尝试向我的自定义 class 键入提示时,python 将在 'module.class' 上抛出 AttributeError。 Intellisence告诉我,import是对的,可以找到class
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,这是导入的class。注意:提示 : 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'
对于任何想知道我正在尝试做什么的人:实施 visitor pattern.
hiro protagonist 是对的。我能够解决循环导入并维护类型检查。它不是那么干净,但可以完成工作。
function.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")
迭代器_function.py
import function
class IteratorFunction(function.Function):
def accept(self, dispatcher):
self.test_dispatcher(dispatcher)
dispatcher.dispatch(self)
当我尝试向我的自定义 class 键入提示时,python 将在 'module.class' 上抛出 AttributeError。 Intellisence告诉我,import是对的,可以找到class
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,这是导入的class。注意:提示 : 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'
对于任何想知道我正在尝试做什么的人:实施 visitor pattern.
hiro protagonist 是对的。我能够解决循环导入并维护类型检查。它不是那么干净,但可以完成工作。
function.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")
迭代器_function.py
import function
class IteratorFunction(function.Function):
def accept(self, dispatcher):
self.test_dispatcher(dispatcher)
dispatcher.dispatch(self)