Profilo di RicPol

Nome RicPol
Indirizzo email ric.pol@libero.it
AvatarAvatar utenti
Messaggi536
Firma forum
  • Re: Capire quando usare la parola chiave "global"
    Forum >> Principianti
    Non è facile scrivere una risposta rapida su un argomento così complesso. L'architettura concettuale che ci sta dietro è piuttosto sofisticata. La cosa migliore è sempre studiare con un buon libro sottomano. Ricordo che il Lutz faceva un buon lavoro a spiegare queste cose.


    Una cosa che dovresti leggere è la sezione relativa del tutorial ufficiale, visto che (oltre tutto) è disponibile in traduzione italiana (fatta indovina da chi): https://pytutorial-it.readthedocs.io/it/python3.9/classes.html#scope-e-namespace-in-python


    E' molto densa, ma se riesci a digerire lentamente parola per parola, è anche molto molto utile.


    Detto questo, la risposta rapida alla tua domanda è: preferibilmente, non usare mai global. Fai solo pasticci con i namespace, e non è questo il modo in cui si dovrebbero fare le cose.


    Global segnala che, all'interno del blocco in cui è dichiarato (per esempio una funzione), i riferimenti a un nome sono da intendersi riferiti allo spazio globale, non allo spazio locale del blocco. Questo serve, in pratica, per ri-assegnare un valore a un nome che vive nello spazio globale, dall'interno di uno spazio locale.




    L'esempio canonico è questo: ovviamente non c'è nessun problema a *leggere* il valore di un nome definito nello spazio globale, da dentro uno spazio locale:

    >>> n = 42
    >>> def f():
    ...     return n - 2
    ...
    >>> f()
    40
    


    Tuttavia non puoi ri-assegnare (*scrivere*) un nome globale da dentro uno spazio locale:

    >>> n = 42
    >>> def f():
    ...     n = 10
    ...
    >>> f()
    >>> n
    42
    
    A meno che, appunto, tu non usi global per dire che il nome che usi nello spazio locale deve intendersi come riferito allo spazio globale, non a quello locale.

    >>> n = 42
    >>> def f():
    ...     global n
    ...     n = 10
    ...
    >>> f()
    >>> n
    10
    
    Ovviamente questa è una pessima idea, ma appunto, alla brutta con global si può fare.


    Ora però, mi raccomando, mi raccomando, mi raccomando: NON limitarti a questa ricettina da copincollare per dire che hai "capito" global, perché davvero, i nomi, i namespace, gli scope in Python sono complessi e davvero dovresti seguire un buon manuale... altrimenti hai solo superato una collinetta ma vai a sbattere dieci metri più in là (non ti dico le classi...)


  • Re: SMBConnection not found da script
    Forum >> Programmazione Python >> Scripting
    ma... hai mica messo un tuo modulo "smb.py" nella directory di python3.9?


    perché questo sarebbe... molto male

  • Re: SMBConnection not found da script
    Forum >> Programmazione Python >> Scripting
    allora stai invocando lo script in modo sbagliato? Comunque purtroppo continui a essere troppo leggero coi dettagli. Hai installato il pacchetto con pip?



  • Re: SMBConnection not found da script
    Forum >> Programmazione Python >> Scripting
    non avrai installato correttamente il pacchetto... e/o hai più python installati, hai messo il pacchetto su uno e ne stai usando un altro... Sai, non è che ci sia molto da "impazzire"... se fallisce l'import di un pacchetto esterno, vuol dire che python non lo trova nella sua sys.path.


    Ora, non so cos'è questo pacchetto, ma suppongo che sia installabile normalmente con pip.

  • Re: IDE Jupyter notebook - come funziona
    Forum >> Programmazione Python >> IDE ed Editor
    Beh, non installerei Anaconda, mi accontenterei della distribuzione ufficiale di Python. Quella che trovi su python.org, insomma.





    No, la "shell di Python" è... la shell di Python, quella con il prompt ">>>". Jupyter è *una* shell di Python, con delle funzionalità in più. Un'altra shell di Python è quella di IDLE. La shell di Python più elementare possibile è quella che ottieni nella finestra del terminale del tuo sistema operativo, invocando "python" al prompt.


    Jupyter usa il termine "kernel" perché sono un po' degli esagerati. "Kernel" si usa per i sistemi operativi, in genere. Comunque, puoi dire che il "kernel" di Jupyter sia la parte che ne garantisce le funzionalità fondamentali. Il kernel di Jupyter è in sostanza la shell Ipython (più qualsiasi altra cosa quelli di Jupyter considerano "kernel"... visto che usano il termine, possono metterci dentro quello che credono... è solo una parola).


    Detto questo, ho scritto un libro su come usare Python in Windows, con tutte le spiegazioni su che cosa è un terminale, che cosa è una shell, che cosa è anaconda, che cosa è... tutto.

  • Re: IDE Jupyter notebook - come funziona
    Forum >> Programmazione Python >> IDE ed Editor
    Uhm. Allora. Dal punto di vista di python, "Jupyter" è un pacchetto come tanti altri. Se non avessi fatto la (molto molto molto discutibile) cosa di installarti Anaconda, potresti tranquillamente installarlo con Pip in una distribuzione di Python "normale".


    Faresti semplicemente "pip install ipython" (in un virtual environment, preferibilmente) e avresti la shell "potenziata" Ipython, che si usa normalmente nella finestra del terminale, ma che offre una certa quantità di cose in più; di base, comunque, è una normale shell Python (come quella che ottieni invocando "python" dal terminale, insomma).


    Inoltre, sulla base di Ipython, potresti anche installare Jupyter vero e proprio, che è un IDE con interfaccia grafica (nel browser). Anche questo è un pacchetto python, e si installa con "pip install jupyter". Jupyter è un IDE vero e proprio, ovvero un ambiente di programmazione più evoluto. Comunque è basato su una shell, quindi non si usa tipicamente per scrivere *programmi* Python. Jupyter viene usato per comporre quelle "presentazioni con sessione di shell interattiva" che vedi ovunque, e ha molte funzionalità. Serve soprattutto in ambito scientifico, ma qui basta che googli un po' e trovi dozzine di esempi. Un "notebook" (ovvero una presentazione) di Jupyter è un file che contiene diversi "box", che possono essere testi, immagini, o (soprattutto) sessioni interattive della shell. Puoi salvare i notebook in un formato specifico (".ipynb"), che comunque *non* è un programma Python eseguibile, ovviamente, ma è appunto un notebook che puoi ri-aprire e riusare in seguito con Jupyter. Puoi anche esportare in html, o in pdf, o cose del genere.


    Se hai Anaconda, allora dentro ci trovi anche sia la shell Ipython, sia Jupyter. (Anaconda è solo una distribuzione di Python, dove oltre a Python ci sono anche una marea di pacchetti in più). Puoi avviare Jupyter direttamente dall'interfaccia di Anaconda, invece che dal terminale, a questo punto è più comodo in questo modo.




  • Re: Tkinter non viene trovato
    Forum >> Programmazione Python >> GUI
    A parte che "virus.py"... non commento... comunque probabilmente sei su una distribuzione di Linux dove tkinter non è installato. Il che significa che devi installartelo con il packet manager del tuo sistema operativo (apt, o quel che è)... cerca in giro come si fa...


    E no, purtroppo tkinter non è un pacchetto distribuito sul pypi e quindi installabile con pip... tkinter ha uno status speciale nelle distribuzioni python... non fa parte della libreria standard, quindi non c'è nessuna garanzia di trovarlo sempre; ma non è neppure un pacchetto esterno normale, che basta installarlo con pip. A dirla tutta, lo status di tkinter è proprio una rogna. Ma è un relitto di un'epoca passata, e ormai ci sono zero probabilità che le cose miglioreranno nel futuro.


    E quindi, un piccolo dubbio per te: se tu stai provando "virus.py" sul tuo computer e scopri di non avere tkinter per farlo girare... chi ti dice che invece sul computer del tuo "amico" tkinter invece ci sarà?




  • Re: Domanda: correzioni su un programma scritto
    Forum >> Principianti
    Mah sai... è difficile dirlo... tecnicamente è scritto molto male, ma ovviamente dipende dalle tue conoscenze a questo punto. Se non hai ancora imparato che cosa è una funzione, se non hai ancora esperienza, etc... allora magari questo è il meglio che si può fare con gli strumenti che hai a disposizione.


    Però non mi preoccuperei troppo adesso, se fossi in te. Continua semplicemente a studiare (usa un buon libro... evita i corsi su youtube... le solite raccomandazioni :-) e vedrai che poco per volta, anche leggendo il codice scritto da altri, progredirai naturalmente.


    Un esercizio che ti suggerisco è di chiudere quel codice in un cassetto e non guardarlo più per un anno... vedrai che tra un anno, rileggendolo, ti verrà automatico scriverlo in una maniera più efficiente.

  • Re: da python a file exe con .bat
    Forum >> Programmazione Python >> Scripting
    Mah, sai... dire "non mi funzia" è un po' vago, capisci. Ho dedicato due capitoli del mio libro solo alla distribuzione dei progetti python, più che altro nella speranza di far capire che è un Problema Difficile. Il fatto è che Python non è stato pensato, fin dall'origine, per funzionare in questo modo (il doppio clic sull'exe). Il codice python tendenzialmente si distribuisce e si utilizza in un altro modo, ovvero avendo già l'interprete installato sulla macchina, e installando i pacchetti con Pip o altro gestore. Non è che non sia possibile pacchettizzare il codice come un eseguibile stand-alone, intendiamoci. Ma in generale non è una cosa che si fa in fretta e senza dolore.


    Pyinstaller tende a funzionare per quanto ne so... nel senso che ha tutti i suoi problemi, ma riesce a fare il suo lavoro almeno nei casi più semplici, e quando il codice da pacchettizzare è organizzato come vuole lui. Ti consiglio di fare delle prove progressivamente più complicate con Pyinstaller. Prima prova a pacchettizzare un singolo script, e vedi che succede e come funziona. Poi prova con uno script che ne importa un altro, e poi via via con delle cose più difficili. Cerca di capire esattamente quello che fa, e perché lo fa.... probabilmente quando qualcosa va storto emetterà degli errori... analizzali...


    Non è che "un file bat" sia di per sé un oggetto magico che risolve i problemi. E' solo un file che contiene una lista di comandi di cmd.exe... puoi usarlo per impostare una directory corrente, per invocare un interprete... ma alla fine, per pacchettizzare un progetto avrai pur sempre bisogno (detto così alla brutta) di infilare un interprete python funzionante, il tuo codice, tutte le dependency necessarie, tutte le eventuali risorse esterne, dentro il "sacco" di un eseguibile.


    Ci sono vari modi per farlo... a mio giudizio Pyinstaller resta un buon prodotto, nella sua fascia. Dovessi scommettere due centesimi, probabilmente il tuo progetto fa qualcosa di "strano" o "sbagliato" che Pyinstaller non riesce a trattare bene. Import non-standard, risorse esterne localizzate male... va a sapere...




  • Re: In Python tutto e' un oggetto...
    Forum >> Principianti
    Quando programmi in python, fai *sempre* programmazione a oggetti, nel senso (stretto) che stai sempre manipolando oggetti, qualunque cosa tu stia facendo, perché tutti i dati in pyhton sono rappresentati come oggetti.


    Tuttavia, quando si parla di "programmazione a oggetti", in genere si intende in senso più ampio: ovvero, quello stile di programmazione per cui tu *modelli da solo i tuoi oggetti*, li crei e li manipoli... quindi (in python) scrivendo codice che comprende diverse dichiarazioni "class", diverse istanziazioni di oggetti e così via.


    In questo senso più ampio, puoi sicuramente usare python senza fare "programmazione a oggetti"... per esempio limitandoti a scrivere solo delle funzioni senza mai dichiarare e usare le classi.


    Tuttavia tieni conto che gran parte delle librerie che trovi in giro (e gran parte della libreria standard stessa) sono scritte nello stile della programmazione a oggetti... il che significa che, se vuoi usarle nel tuo codice, ti tocca comunque studiarti un po' di cose sulle classi, etc.... e quindi, in un certo senso, se nel tuo codice utilizzi delle librerie a oggetti, allora anche il tuo codice diventa, almeno in parte, "codice a oggetti".


    E comunque, non dimenticarti che, in senso stretto, "in python tutto è un oggetto"... quindi puoi anche scrivere una funzione e "apparentemente" non fare OOP, ma... guarda che *anche* una funzione in Python è un oggetto! Anche se, usandola, non te ne accorgi.