Profilo di nuzzopippo

Nome nuzzopippo
Indirizzo email nuzzopippo@gmail.com
AvatarAvatar utenti
Messaggi78
Firma forum
Fatti non foste a viver come bruti...
  • Re: print variabile
    Forum >> Principianti
    Parlando di "altri linguaggi", il mio "battesimo" sulla OOP è avvenuto con java e li gli oggetti sono delle scatole chiuse, non è possibile sapere cosa c'è all'interno, confesso che la "liberalità" di python in materia mi ha, inizialmente, sconcertato.




    Argomento interessante quello da Te posto, provo a dire la mia pur non essendo ben "carrozzato" teoricamente, sono solo un hobbysta che cerca, con scarso successo, di capirci qualcosa, le mie "interpretazioni" non valgono poi molto. Scusami se sarò un po' prolisso ma serve anche per fissare i miei pensieri.





    Il Tuo quesito sorge dai concetti sviluppati nel tutorial nei capitoli "9.3.2 Gli Oggetti-Classe" e "9.3.3 Oggetti-Istanza", per comodità, nel proseguire su quanto io "credo" di aver capito, intenderò con il termine "classe" il codice stesso implementante una generica classe, quale "oggetto" una generica variabile creata da una istanza a detta classe.

    Ora quando noi implementiamo un codice qualsiasi vi è un "qualcosa" che si interpone tra il codice e la sua esecuzione: l'interprete

    In prima istanza l'interprete valuta il codice della classe implementata e lo interpreta secondo i parametri contenuti nel suo data-model, in tale stato "preparatorio" le definizioni di processi interne alla implementazione di una classe sono in effetti funzioni, prendendo, ad esempio, la MyClass definita al capitolo 9.3.2, sarà facile vedere ciò

    Python 3.10.6 (main, Mar 10 2023, 10:55:28) [GCC 11.3.0] on linux
    Type "help", "copyright", "credits" or "license()" for more information.
    class MyClass:
        i = 12345
        def f(self):
            return 'hello world'
    
        
    print(MyClass.f)
    <function MyClass.f at 0x7f2c75a81cf0>
    print(MyClass.f())
    Traceback (most recent call last):
      File "/usr/lib/python3.10/idlelib/run.py", line 578, in runcode
        exec(code, self.locals)
      File "<pyshell#6>", line 1, in <module>
    TypeError: MyClass.f() missing 1 required positional argument: 'self'
    Come possiamo vedere dall'output MyClass.f è a tutti gli effetti una funzione e viene riconosciuta come tale MA non può essere utilizzata per come è stata definita ... guarda caso, definendo un oggetto "x" dalla istanza di tale classe

    x = MyClass()
    print(x.f)
    <bound method MyClass.f of <__main__.MyClass object at 0x7f2c75a4b700>>
    print(x.f())
    hello world
    
    x.f() viene eseguito MA non è più una funzione bensì un metodo : È intervenuto nuovamente l'interprete che ha trasformato la definizione che precedentemente "ha preparato" in qualcosa di nuovo, estremamente specifico ed a se stante, infatti, supponendo di definire due istanze alla stessa classe esse non saranno uguali ed avranno indirizzi di memoria diversi

    x = MyClass()
    y = MyClass()
    x == y
    False
    repr(x)
    '<__main__.MyClass object at 0x7f2c75a4b820>'
    repr(y)
    '<__main__.MyClass object at 0x7f2c75a4b8b0>'
    
    In sostanza l'interprete ha trasformato l'originale MyClass.f da generica funzione a qualcosa d'altro (metodo) che è specifico per i singoli oggetti creati tramite la classe ... è questa specificità ("<<appartenenza>>" nel tutorial) che distingue un metodo da una funzione, oltre, naturalmente, al riferimento alla specifica istanza dell'oggetto stesso (il convenzionale "self", come certo sai).

    Delizioso è notare il caso di mancata definizione del riferimento allo oggetto istanziato in MyClass.f

    class MyClass:
        i = 12345
        def f():
            return 'hello world'
    
        
    print(MyClass.f)
    <function MyClass.f at 0x7f2c6f6df490>
    print(MyClass.f())
    hello world
    x = MyClass()
    print(x.f)
    <bound method MyClass.f of <__main__.MyClass object at 0x7f2c75a4a020>>
    print(x.f())
    Traceback (most recent call last):
      File "/usr/lib/python3.10/idlelib/run.py", line 578, in runcode
        exec(code, self.locals)
      File "<pyshell#16>", line 1, in <module>
    TypeError: MyClass.f() takes 0 positional arguments but 1 was given
    
    A livello di classe f viene eseguita tranquillamente, dato che è una funzione, ma a richiamarla da un oggetto l'interprete si "arrabbia", essendo diventato un "metodo" non conforme al data-model previsto e non riferibile alla istanza definita.




    Con 'sta tiritera ho cercato di esporre ciò che credo di aver capito io sull'argomento, probabilmente toppo su qualcosa, è un argomento per conoscenze più raffinate della mia, magari qualcuno più capace interverrà, in ogni caso non mi dispiacerebbe sapere cosa ne pensi Tu.




    Ciao :)

    Fatti non foste a viver come bruti...
  • Re: print variabile
    Forum >> Principianti
    ma in pratica in questo modo, il metodo crea un nuovo attributo nella Classe?

    Si, esatto.

    Riguardo :

    se quanto detto sopra e' corretto, l'intento (se possibile) sarebbe di richiamare la variabile di Def1() e non che, tramite Def1 vado a creare una variabile nella Classe per poi richiamarla all'esterno.
    Ti risponde direttamente il Tutorial, nel capitolo che ho messo in link dice :

    Il namespace locale di una funzione viene creato al momento di chiamare la funzione e distrutto quando la funzione restituisce il suo risultato o emette un’eccezione che non viene gestita all’interno della funzione. (In realtà, «dimenticato» è un termine più appropriato per descrivere quello che accade.) Naturalmente le invocazioni ricorsive hanno ciascuna il proprio namespace.
    Conseguenza, ovvia, di quanto sopra è che non si può accedere ad una variabile con scope locale alla funzione, perché esso viene distrutto (ovvero "dimenticato") non appena terminata la funzione. Il metodo di una classe essenzialmente non è diverso da una funzione, il suo namespace locale non è accessibile dall'esterno del metodo stesso, quindi le variabili locali alla funzione non sono accessibili dall'esterno, neanche dall'interno dell'oggetto stesso.

    Pertanto non Ti rimane altro che definire o manipolare una proprietà di classe o di istanza perché possa essere disponibile una certa variabile manipolata da un metodo dell'oggetto stesso.

    Almeno è quanto credo di sapere io, pur non essendo certo un guru di python, magari qualcuno più ferrato in materia conosce qualcosa che si avvicini a ciò che Vorresti, personalmente non credo sia possibile.




    Forse, se descrivi precisamente i motivi e condizioni per le quali Ti servirebbe l'insolita metodologia che stai cercando di realizzare un risultato alternativo da Te accettabile potrebbe essere escogitato; se Ti va di parlarne ...




    Fatti non foste a viver come bruti...
  • Re: print variabile
    Forum >> Principianti
    Così come hai impostato la Tua classe NON puoi ottenere pluto, perché per la classe non esiste per le regole di visibilità, devi fare si che il Tuo metodo "Def1" definisca tale variabile per la classe, quindi utilizzarla come le normali variabili di classe ... Ti faccio un esempio in una sessione IDLE :

    class Classe:
        pippo = 5
        @staticmethod
        def Def1():
            Classe.pluto = 7
    
            
    var Classe()
    SyntaxError: invalid syntax
    var = Classe()
    var.pluto
    Traceback (most recent call last):
      File "/usr/lib/python3.10/idlelib/run.py", line 578, in runcode
        exec(code, self.locals)
      File "<pyshell#11>", line 1, in <module>
    AttributeError: 'Classe' object has no attribute 'pluto'
    var.Def1()
    var.pluto
    7
    Spero Ti sia utile, anche se mi chiedo come mai utilizzi un modo così poco ortodosso, le variabili di istanza non sarebbero più appropriate?

    Fatti non foste a viver come bruti...
  • Re: Python Hangman Game Program Error
    Forum >> Programmazione Python >> Videogames
    I noticed, now, that the post editor has altered the code, the correction of the code seems not to be allowed,
    however in the statement "if word == guess:" the "word" is followed by an "i" in square brackets
    Fatti non foste a viver come bruti...
  • Re: Python Hangman Game Program Error
    Forum >> Programmazione Python >> Videogames
    Hi Gulshan, I don't speak English, the following text is produced by google translator, sorry for any poor language skills




    If you want help, learn how to format the code using the appropriate button ("<>") in the post editor, how you expose it is difficult to understand.
    It would also be appropriate to report the traceback received ... things already indicated in previous post.




    Coming to your code, it has several critical issues:
    the most serious is the "count += 1: " code present in the "hangman" function, the ":" character generates a syntax error
    Another criticality is given by the "while play:" line in the "play_hangman" function, since the "play" variable is not initialized, therefore it cannot be used.

    The code itself is very questionable, in particular with regard to instructions such as "if count == 1 :" and related print, as well as the mode of intercepting user input which, however, stops at the first occurrence of the entered character.

    I am attaching below a rehash to make your code functional at a minimum, I haven't studied it well and it is limited to what I understand it is needed, but it should work anyway; see and understand the differences in logic

    import random
    import time
    import os
    
    
    def play_again ():
        question = 'Do You want to play again? y = yes, n = no \n'
        play_game = input (question)
        while play_game.lower() not in [ 'y' , 'n' ]:
            play_game = input (question)
    
        if play_game.lower() == 'y ' :
            return True
    
        return False
    
    
    def hangman(word):
        display = '_' * len(word)
        count = 0
        limit = 5
        letters = list(word)
        guessed = []
        print(f'You have {limit} possible errors...\n')
        while count < limit:
            guess = input(f'Hangman Word: {display} Enter your guess:\n').strip()
            if len(guess) != 1 :
                print ( 'Invalid input. Enter a single letter \n' )
                continue
            if guess in guessed:
                print ( 'Oops! You already tried that guess, try again!\n' )
                continue
    
            if guess in letters:
                letters.remove(guess)
                for i in range(len(word)):
                    if word[ i ] == guess:
                        display = display[:i] + guess + display[i+1:]
                print (' ' + '*' * (limit - count),
                       f'\n Good guess: {limit - count} guesses remaining\n')
            else :
                guessed.append(guess)
                count += 1
                print (' ' + '*' * (limit - count),
                       f'\n Wrong guess: {limit - count} guesses remaining\n')
            time.sleep(1)
            if display == word:
                print ( f'Congrats! You have guessed the word \' {word} \' correctly!' )
                break
            if count == limit:
                print ('\nThe word was: {word} ' )
                break
    
    
    def play_hangman ():
        print ( ' \nWelcome to Hangman\n' )
        name = input ( 'Enter your name: ' )
        print ( f'Hello {name} ! Best of Luck!' )
        time.sleep( 1 )
        print ('The game is about to start!\nLet\'s play Hangman!' )
        time.sleep( 1 )
        os.system( 'cls' if os.name == 'nt' else 'clear' )
        words_to_guess = ['january' , 'border' , 'image' , 'film' , 'promise' , 'kids' ,
                          'lungs' , 'doll' , 'rhyme' , 'damage' , 'plants' , 'hello']
        play = True
        while play:
            word = random.choice(words_to_guess)
            hangman(word)
            play = play_again()
    
        print ( 'Thanks For Playing! We expect you back again!' )
        exit()
    
    
    if __name__ == '__main__' :
        play_hangman() 
    I hope it can help you

    edit : I realized, now, that the post editor has altered the code, I corrected it


    --- Ultima modifica di nuzzopippo in data 2023-05-05 14:50:21 ---
    Fatti non foste a viver come bruti...
  • Re: La clausola "WITH" in MySQL
    Forum >> Principianti
    Sto tentando di utilizzare MySQL per costruire una vista che includa la clausola "WITH".
    ...
    Tuttavia, non sembra che MySQL lo supporti. Questo mi sembra ...
    Dalla docs di MySQL 8.0 sembrerebbe, invece, che lo statement "WITH" sia supportato, di più non potrei dire dato che non conosco MySQL e, comunque, non bazzico database relazionali dalla notte dei tempi.

    Ho utilizzato, nel passato, database Oracle e PostgreSQL ma with non l'avevo mai sentito nominare, leggere il Tuo post mi ha incuriosito.




    Ciao

    Fatti non foste a viver come bruti...
  • Re: Python Password Generator Program Error
    Forum >> Programmazione Python >> Database
    He doesn't speak English, this text is produced by google translate
    For future code examples format the text using the appropriate button available in the post editor. Also provide the traceback received for evaluation.

    I interpreted your code and found two possible errors introduced by the editor:

    pwd = ''"
    and an obvious syntax error

    pw_strong = False:
    corrected these imperfections, the code thus implemented

    import secrets
    import string
    
    def create_pw(pw_length=12):
        letters = string.ascii_letters
        digits = string.digits
        special_chars = string.punctuation
        alphabet = letters + digits + special_chars
        pwd = ""
        pw_strong = False
        while not pw_strong:
            pwd = ""
            for i in range(pw_length):
                pwd += ''.join(secrets.choice(alphabet))
            if (any(char in special_chars for char in pwd) and
                sum(char in digits for char in pwd) >= 2):
                pw_strong = True
        return pwd
    
    
    if __name__ == '__main__':
        print(create_pw())
    
    
    seems to work fine, this is the output in an IDLE shell

    Python 3.10.6 (main, Mar 10 2023, 10:55:28) [GCC 11.3.0] on linux
    Type "help", "copyright", "credits" or "license()" for more information.
    
    ============ RESTART: /home/nuzzopippo/src/posts/Gulshan Negi /suo.py ===========
    =1uh!5RLrl>2
    let me know if it fixes, bye

    Fatti non foste a viver come bruti...
  • Re: Programma in Python con interfaccia locale
    Forum >> Programmazione Python >> Database
    Well, in my recent search I found that the problem with your code is that the Tkinter GUI loop begins before the database connection is established. The connection must be established within the login function so that it can only be established when the login button is pressed.

    Not necessarily, the tkinter mainloop can be bypassed using the publisher/subscriber pattern and a messaging protocol, p.e.

    I apologize for the post syntax I don't speak English
    Fatti non foste a viver come bruti...
  • Re: problema identazione e differente posizione rispetto al prompt
    Forum >> Programmazione Python >> Scripting
    Perché python è un bravo ragazzo e fa esattamente quello che Tu gli dici di fare ;)




    Basta leggere la docs della funzione built-in print(), di default inserisce un carattere '\n' alla fine della stampa di una stringa, il che equivale a dire che inserisce una nuova riga e ritorna a capo.

    Inserendo il parametro "end=', '" ovvero "end=' '" Tu alteri tale comportamento ed alla fine della stampa viene inserito una virgola + spazio o solo uno spazio, rispettivamente; inserendo fuori dal ciclo una print() vuoto non vengono stampati caratteri, che non ci sono, ma il default "end='\n'" viene rispettato ed il suo effetto è di inserire una nuova riga e tornare a capo (in sostanza inserire un cariage return + line feed nel mondo windows, un EOL nel mondo Unix-like)

    Fatti non foste a viver come bruti...
  • Re: connessione al db postgres
    Forum >> Programmazione Python >> Database
    ho difficoltà a installare il modulo psycopg2 tramite pip3. ho il seguente errore:
    ...
    la versione di Python installata è 3.5.2 e quella del pip è 23.

    La documentazione di psycopg2 indica chiaramente che sono supportate le versioni python dalla 3.6 alla 3.11, quindi il problema nasce dalla versione troppo arretrata di python che utilizzi. Personalmente procederei ad installare la versione più recente di python disponibile per il Tuo sistema ed utilizzare quella, non a cercare versioni più remote del driver per Postgresql, che per altro è alla versione 3.1.8, in PyPI.

    Per altro, dovresti anche verificare tramite la documentazione se la versione del server postgresql target della Tua applicazione è compatibile con le versioni supportate dal driver che deciderai di usare, potrai vederlo nei pre-requisiti della documentazione relativa.

    Fatti non foste a viver come bruti...