0

Lorsque j'essaie de taper hint dans ma classe personnalisée, python lance un attribut AttributeError sur 'module.class'. L'Intellisence me dit, l'importation est juste et la classe peut être trouvée.L'indication de type Python 3.5 donne "AttributeError: le module 'iterator_function' n'a pas d'attribut 'IteratorFunction'"

function_dispatcher.py, il se passe mal dans ce fichier à : iterator_function.IteratorFunction. Lorsque je supprime l'indice de type particulier, le programme fonctionne correctement.

from abc import ABC, abstractclassmethod 
import iterator_function 

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

iterator_function.py, il s'agit de la classe importée. Remarque: le type indiquant : function_dispatcher.FunctionDispatcher fonctionne ici.

import function 
import function_dispatcher 

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

C'est la sortie de retraçage:

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' 

Pour ceux qui se demandent ce que je suis en train de faire: la mise en œuvre du visitor pattern.

+2

semble que vous avez un ([import circulaire] https://docs.python.org/3.5/faq/programming.html # quoi-sont-les-meilleures-pratiques-pour-utiliser-importer-dans-un-module). –

Répondre

0

hiro protagonist avait raison. J'ai été capable de résoudre l'importation circulaire et maintenir la vérification de type. Ce n'est pas aussi propre mais ça fait l'affaire.

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)