Topic: Moduli e classi dinamiche  (Letto 178 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline SeverusPiton

  • python unicellularis
  • *
  • Post: 2
  • Punti reputazione: 0
    • Mostra profilo
Moduli e classi dinamiche
« il: Novembre 28, 2020, 19:54 »
Come si può importare un modulo, istanziare una  classe di quel modulo e successivamente chiamare un metodo i cui nomi si conoscono solo in fase di esecuzione ovvero sono contenuti in 3 variabili?

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.146
  • Punti reputazione: 9
    • Mostra profilo
Re:Moduli e classi dinamiche
« Risposta #1 il: Novembre 28, 2020, 20:48 »
stai attento alle falle di sicurezza, e usa getattr https://docs.python.org/3/library/functions.html#getattr

Offline SeverusPiton

  • python unicellularis
  • *
  • Post: 2
  • Punti reputazione: 0
    • Mostra profilo
Re:Moduli e classi dinamiche
« Risposta #2 il: Novembre 28, 2020, 21:01 »
però per usare getattr() devo aver già l'oggetto, io prima devo importare il modulo e poi creare l'oggetto. Il nome del modulo e della classe sono contenuti in variabili.

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 336
  • Punti reputazione: 0
    • Mostra profilo
Re:Moduli e classi dinamiche
« Risposta #3 il: Novembre 29, 2020, 09:11 »
però per usare getattr() devo aver già l'oggetto, io prima devo importare il modulo e poi creare l'oggetto. Il nome del modulo e della classe sono contenuti in variabili.

Mi ha incuriosito questo post, incuriosito perché non riesco ad immaginare lo scopo di un programma che non sappia, a priori, quale funzioni e metodi utilizzare ... "come farebbe a funzionare?" è la domanda che mi viene spontanea.
Tale curiosità mi ha portato a fare alcune ricerche, su stackoverflow ho trovato una discussione, direi interessante, titolata "Parsing python file for all methods and classes" che, unita ai metodi di pkgutil.iter_modules(), forse, potrebbe essere utile ... magari, i metodi e funzioni altre di pkgutil, anche di più.

In ogni caso, iter_modules() permette di ottenere il pathdir ed il nome del modulo, nell'esempio sotto, di tutti quelli disponibili in un venv (limitato, ovvio)

>>> import pkgutil
>>> pkgutil.iter_modules()
<generator object iter_modules at 0x7fed9be857b0>
>>> list_mod = pkgutil.iter_modules()
>>> for m in list_mod:
...     print(m)
...
ModuleInfo(module_finder=FileFinder('/usr/lib/python3.8'), name='__future__', ispkg=False)
ModuleInfo(module_finder=FileFinder('/usr/lib/python3.8'), name='_bootlocale', ispkg=False) ...

Magari può essere utile, segnalo.

Ciao
« Ultima modifica: Novembre 29, 2020, 09:13 da nuzzopippo »

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.146
  • Punti reputazione: 9
    • Mostra profilo
Re:Moduli e classi dinamiche
« Risposta #4 il: Novembre 29, 2020, 11:28 »
> non riesco ad immaginare lo scopo di un programma ...

Mah, naturalmente ci sono casi in cui davvero ti serve tutta questa dinamicità... per esempio se stai scrivendo un debugger, dei componenti integrati per un editor... allora effettivamente potresti aver bisogno di importare moduli di cui non sai il nome, e cose del genere.

Il problema qui è un po' come per le metaclassi... se davvero sei in uno scenario in cui devi usare 'sta roba, allora *sai già* che cosa è e che devi usarla. Ma il 99% delle volte non ne hai davvero bisogno e ti stai solo complicando la vita.
Qui i casi sono del tipo...
- "mi piacerebbe fare un sistema di plugin..."
- "voglio offrire un menu all'utente..."
eccetera eccetera. (Fino a, ovviamente, "non ho davvero capito come funziona una variabile"). Nel 99% dei casi è solo una falla di sicurezza grande come il sistema solare. https://en.wikipedia.org/wiki/Arbitrary_code_execution

Detto ciò, va bene pkgutil, ma tipicamente l'importazione dinamica di un modulo si fa con importlib https://docs.python.org/3/library/importlib.html