[Python] Problema di Importazione incrociata legato alle Function Annotations

Piacenza Federico piacenza.federico a gmail.com
Ven 16 Mar 2018 15:26:22 CET


Ciao a tutti,

ho un problema di importazione incrociata che mi si è presentato nel
momento in cui ho iniziato ad inserire le 'annotations' sul valore di
ritorno dei metodi delle mie classi.

Ho cercato di costruire un esempio (il piu' piccolo possibile e che trovate
in fondo alla mail) che presentasse la problematica.

In pratica dopo aver lanciato il *main.py* il programma va in *ImportError *nel
momento in cui cerca di fare l'importazione '*from **Cassetto import
CCassetto'* contenuta nel file *Oggetto.py*.

L'importazione in questione la faccio solamente allo scopo di documentare
il metodo *getCassetto()* della classe *COggetto*.

Cosa sbaglio? Uso male la tecnica delle Function Annotations?


Un grazie anticipato a chi mi puo' dare dei suggerimenti per
risolvere/aggirare il problema.




di seguto il messaggio di errore:










*C:\Users\Federico\Dropbox\Lavoro\Prove\Prova\venv\Scripts\python.exe
C:/Users/Federico/Dropbox/Lavoro/Prove/Prova/main.pyTraceback (most recent
call last):  File "C:/Users/Federico/Dropbox/Lavoro/Prove/Prova/main.py",
line 1, in <module>    from Cassetto import CCassetto  File
"C:\Users\Federico\Dropbox\Lavoro\Prove\Prova\Cassetto.py", line 1, in
<module>    from Oggetto import COggetto  File
"C:\Users\Federico\Dropbox\Lavoro\Prove\Prova\Oggetto.py", line 2, in
<module>    from Cassetto import CCassettoImportError: cannot import name
'CCassetto'*



*Main.py*

from Cassetto import CCassetto
from typing import List

class CScrivania:
   def __init__(self, dCassetti):
      self.dCassetti = {}
      #
      for sCassettoNome in dCassetti:
         self.dCassetti[sCassettoNome] = CCassetto(sCassettoNome,
dCassetti[sCassettoNome])
   def getlCassetti(self) -> List[CCassetto]:
      return list(self.dCassetti.values())

if __name__ == '__main__':
   dCassetti = {"Cassetto1": ["penna"], "Cassetto2": ["gomma", "cancelletto"]}
   oScrivania = CScrivania(dCassetti)



*Cassetto.py*

from Oggetto import COggetto
from typing import List

class CCassetto:
   def __init__(self, Nome, lOggettiNomi):
      self.Nome = Nome
      self.lOggetti = []
      for sOggettoNome in lOggettiNomi:
         self.lOggetti.append(COggetto(pCassetto=self, Nome=sOggettoNome))

   def getlOggetti(self) -> List[COggetto]:
      return self.lOggetti



*Cassetto.py*

from typing import List
from Cassetto import CCassetto # questa importazione è fatta solo per
la parte descrittiva del metodo getCassetto() nella classe 'COggetto'

class COggetto:
   def __init__(self, *, pCassetto, Nome):
      self.pCassetto = pCassetto
      self.Nome = Nome

   def getCassetto(self) -> CCassetto:
      return self.pCassetto
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20180316/a519cbc5/attachment.html>


Maggiori informazioni sulla lista Python