0

は、Pythonは「module.class」に関するはAttributeErrorを投げます「はAttributeErrorモジュールのiterator_function 'が何の属性 『IteratorFunction』を持っていません」。 Intellisenceは私に、輸入が正しいことを教えてくれます。クラスが見つかります。のPython 3.5タイプヒンティングが与える:私は私のカスタムクラスにヒントを入力しようとすると

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' 

誰もが私がやろうとしていますかと思っについて:visitor patternを実装します。

+2

あなたは[円形インポート](https://docs.python.org/3.5/faq/programming.htmlを持っているように見えます#モジュールでのインポートを使用するためのベストプラクティス)。 –

答えて

0

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") 

iterator_function.py

import function 

class IteratorFunction(function.Function): 
    def accept(self, dispatcher): 
     self.test_dispatcher(dispatcher) 
     dispatcher.dispatch(self) 
関連する問題