[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