[Python] Problema di Importazione incrociata legato alle Function Annotations

Riccardo Magliocchetti riccardo.magliocchetti a gmail.com
Ven 16 Mar 2018 15:37:24 CET


Ciao Federico,

Il 16/03/2018 15:26, Piacenza Federico ha scritto:
> 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.
[...]
> 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?

In python di solito non si usano i getter ma si va dritti sugli attributi. Ma 
questo non ti risolve il problema degli import perchè potresti annotare i 
parametri di init.
Magari gli import incrociati sono un sintomo di classi fatte male? O magari 
semplicemente ti basta non dividere ogni classe nel proprio file?

E le convenzioni dei nomi delle variabili sembrano più per C++ che per Python. A 
maggior ragione se usi le annotazioni dei tipi quella convenzione è ancora meno 
utile.

> *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


-- 
Riccardo Magliocchetti
@rmistaken

http://menodizero.it


Maggiori informazioni sulla lista Python