IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Problème Py 3.11 je n'arrive pas à faire un str.replace pour une varialbe self.x


Sujet :

Python

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2022
    Messages : 3
    Par défaut Problème Py 3.11 je n'arrive pas à faire un str.replace pour une varialbe self.x
    Bonjour,

    Python 3.11 (distribution winpython) sous WIndows 10

    Dans l'exemple joint, je n'arrive pas à comprendre comment arriver à assigner une valeur à une variable d'un objet.
    J'ai le même fonctionnement que ce soit dans une "dataclass" ou une classe standard.

    La dataclass contient une serie de date. Quand ces dates sont lues, elles sont au format ISO avec un 'T' comme séparateur date - temps.
    Je souhaite simplement remplacer ce 'T' par un ' ' (espace) et j'utilise la fonction replace.
    Le problème c'est que dans boucle qui lit mes dates, le replace n'est pas pris en compte.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    import datetime
    from dataclasses import dataclass,field
     
     
    @dataclass(slots=True)  # ! cela veut dire que pas de __dict__ dans les instances !!!
     
    class DacCols:
     
        compte:   str
        datecomptable: str
        datevaleur:    str
        reference:     str
        opdate: str
     
        valid: bool = field(init=False,compare=False)
     
        def __post_init__(self):
     
            self.valid = True
            self.validate_fields()
     
        def validate_fields(self):
            """validation des champs sauvés dans la dataclass"""
     
            for thisdate in (self.datevaleur,self.opdate,self.datecomptable):
     
                if thisdate is self.datevaleur: pr = True
                else: pr = False
     
                if pr: print(f'START:{thisdate} --- {thisdate is self.datevaleur} --- {type(thisdate)} --- {id(thisdate)}')
     
                if 'T' in thisdate: # remp
                    if pr: print(f'AVANT:{thisdate} --- {thisdate is self.datevaleur} --- {type(thisdate)} --- {id(thisdate)}')
     
                    thisdate = thisdate.replace('T',' ')
     
                    if pr: print(f'APRES:{thisdate} --- {thisdate is self.datevaleur} --- {type(thisdate)} --- {id(thisdate)}')
     
            self.datevaleur = self.datevaleur.replace('T',' ')
            print(f'APRESTOUT:{self.datevaleur} --- {self.datevaleur is self.datevaleur} --- {type(self.datevaleur)} --- {id(self.datevaleur)}')
     
            print("OUT:",self.datevaleur,self.opdate,self.datecomptable)
     
    class StdCols:
     
        def __init__(self,compte='', datecomptable='', datevaleur='', reference='', opdate=''):
     
            self.compte = compte
            self.datecomptable = datecomptable
            self.datevaleur = datevaleur
            self.reference = reference
            self.opdate = opdate
            self.valid = False
     
            self.validate_fields()
     
        def validate_fields(self):
            """validation des champs sauvés dans la dataclass"""
     
            for thisdate in (self.datevaleur, self.opdate, self.datecomptable):
     
                if thisdate is self.datevaleur:
                    pr = True
                else:
                    pr = False
     
                if pr: print(f'START:{thisdate} --- {thisdate is self.datevaleur} --- {type(thisdate)} --- {id(thisdate)}')
     
                if 'T' in thisdate:  # remp
                    if pr: print(
                        f'AVANT:{thisdate} --- {thisdate is self.datevaleur} --- {type(thisdate)} --- {id(thisdate)}')
     
                    thisdate = thisdate.replace('T', ' ')
     
                    if pr: print(
                        f'APRES:{thisdate} --- {thisdate is self.datevaleur} --- {type(thisdate)} --- {id(thisdate)}')
     
            self.datevaleur = self.datevaleur.replace('T', ' ')
            print(
                f'APRESTOUT:{self.datevaleur} --- {self.datevaleur is self.datevaleur} --- {type(self.datevaleur)} --- {id(self.datevaleur)}')
     
            print("OUT:", self.datevaleur, self.opdate, self.datecomptable)
            # map(lambda D: D.replace('T' , ' '), (self.datevaleur, self.opdate, self.datecomptable))
            # print("OUT:", self.datevaleur, self.opdate, self.datecomptable)
     
     
    def main():
     
        DAC = DacCols(compte='XXXXXXX', datecomptable='2021-05-07T00:00:00.000',
                      datevaleur='2021-05-01T00:00:00.000',
                      reference='2021-00008',
                      opdate='2021-05-12T00:00:00.000')
     
        print(DAC)
        CLA = StdCols(compte='XXXXXXX', datecomptable='2021-05-07T00:00:00.000',
                      datevaleur='2021-05-01T00:00:00.000',
                      reference='2021-00008',
                      opdate='2021-05-12T00:00:00.000')
     
        print(CLA)
     
    if __name__ == '__main__':
        main()
    # ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    Sortie complète :

    ///// dataclass
    START:2021-05-01T00:00:00.000 --- True --- <class 'str'> --- 2163923333520
    AVANT:2021-05-01T00:00:00.000 --- True --- <class 'str'> --- 2163923333520
    APRES:2021-05-01 00:00:00.000 --- False --- <class 'str'> --- 2163926942704
    APRESTOUT:2021-05-01 00:00:00.000 --- True --- <class 'str'> --- 2163926942464
    OUT: 2021-05-01 00:00:00.000 2021-05-12T00:00:00.000 2021-05-07T00:00:00.000
    DacCols(compte='XXXXXXX', datecomptable='2021-05-07T00:00:00.000', datevaleur='2021-05-01 00:00:00.000', reference='2021-00008', opdate='2021-05-12T00:00:00.000', valid=True)

    ////////résultats avec utilisation classe "normale"
    START:2021-05-01T00:00:00.000 --- True --- <class 'str'> --- 2163923333520
    AVANT:2021-05-01T00:00:00.000 --- True --- <class 'str'> --- 2163923333520
    APRES:2021-05-01 00:00:00.000 --- False --- <class 'str'> --- 2163926942704
    APRESTOUT:2021-05-01 00:00:00.000 --- True --- <class 'str'> --- 2163926943584
    OUT: 2021-05-01 00:00:00.000 2021-05-12T00:00:00.000 2021-05-07T00:00:00.000
    <__main__.StdCols object at 0x000001F7D3E26A90>
    # ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Quelques explications....

    Quand je fais tourner ce code, aucune des dates dans la boucle n'est modifiée.
    Voici les différents 'print': (je ne prends qu'une date pour les explications).

    START:2021-05-01T00:00:00.000 --- True --- <class 'str'> --- 2489041465744
    AVANT:2021-05-01T00:00:00.000 --- True --- <class 'str'> --- 2489041465744
    APRES:2021-05-01 00:00:00.000 --- False --- <class 'str'> --- 2489045075568 #après le replace, ce n'est plus le même 'id'

    APRESTOUT:2021-05-01 00:00:00.000 --- True --- <class 'str'> --- 2489045075648 # ici je passe par self.date = self.date.replace('T','') et évidement cela fonctionne.

    OUT: 2021-05-01 00:00:00.000 2021-05-12T00:00:00.000 2021-05-07T00:00:00.000 # impression après la boucle -> le T reste pour les dates que je n'ai pas forcées.
    # ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    Pourquoi la boucle avec le replace() ne me donne pas le résultat voulu ? J'ai dû oublier quelquechose...


    Mais comment faire que ma boucle puisse appliquer le replace ? Qu'est-ce qui m'échappe ? Je comprends que comme l'id change, je n'ai pas le résultat voulu quand je fais thisdate = thisdate.replace ;coment faire pour que cela fonctionne ?
    Ma solution de contournement est simple, ne pas passer par une boucle mais modifier explicitement les dates. J'aimerais néanmoins comprendre pourquoi cela ne va pas dans une boucle ?

    Merci pour vos explications.
    Julio
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [4.x] je n'arrive pas à faire fonctionner symfony 4 sur une Machine ubuntu18.4
    Par MathieuDelgado dans le forum Symfony
    Réponses: 9
    Dernier message: 10/06/2019, 16h52
  2. [Spip] simple problème de require que je n'arrive pas à résoudre
    Par beegees dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 04/12/2013, 10h01
  3. Réponses: 1
    Dernier message: 26/12/2012, 09h41
  4. Problème un peu bête mais j'arrive pas a comprendre.
    Par mckilleron dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 15/09/2010, 11h33
  5. Réponses: 1
    Dernier message: 12/02/2007, 15h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo