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

PyQt Python Discussion :

Importance de l'ordre des imports dans Pyside [QtGui]


Sujet :

PyQt Python

  1. #1
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut Importance de l'ordre des imports dans Pyside
    Bonjour à tous

    J'ai eu hier un souci sur un code Pyside6. Ce code fait partie de ceux que j'ai mis en téléchargement dans mes exemples PyQt (donc ça veut dire qu'il avait fonctionné à un moment) mais hier il ne fonctionnait plus.

    Et après décortication, j'ai trouvé que le souci provenait de l'ordre des imports.

    Premier exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from PySide6.QtWidgets import *
    from PySide6.QtCore import *
     
    print(issubclass(QSlider, QWidget))
    Ce code fonctionne et affiche "True" ce qui correspond à ce que j'attendais, un QSlider est bien un objet hérité d'un QWidget

    Second exemple: on inverse les imports
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from PySide6.QtCore import *
    from PySide6.QtWidgets import *
     
    print(issubclass(QSlider, QWidget))
    Et là, ça ne va plus, il affiche "False" indiquant que là, un QSlider n'est pas un héritier d'un QWidget. De là (et c'était le souci de mon code) je ne peux plus le mettre dans un layout ou autre action inhérente à un QWidget.

    Toutefois dans les deux cas, si je rajoute...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    app=QApplication([])
    s=QSlider()
    print(s)
    ...ça affiche bien Pyside6.QtWidgets.QSlider montrant que le QSlider provient bien du QtWidets. De même essayer d'importer un QSlider depuis QtCore ne fonctionne pas. Le QtCore ne possède pas de QSlider.

    Donc avez-vous un avis sur le fait que dans le second cas, un QSlider n'est pas un QWidget alors que rien ne devrait le gêner à ce propos ?

    Merci à tous.

    PS: Qt 6.7.0, Pyside 6.7.0 et Python 3.10.12

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 885
    Points : 7 233
    Points
    7 233
    Par défaut
    Hello,

    Si tu fais cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import PySide6.QtCore as QtCore
    import PySide6.QtWidgets as QtWidgets
     
     
    print(issubclass(QtWidgets.QSlider, QtWidgets.QWidget))
    ça donne quoi ?

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Salut, merci de venir voir le sujet
    Citation Envoyé par fred1599 Voir le message
    ça donne quoi ?
    Ca donne "True". On retombe sur un cas qui fonctionne. Après j'ai aussi la solution de bien checker l'ordre des imports ; ce qui fonctionne aussi. Mais ça ne m'explique pas ce qui se passe dans le second exemple

    Pour info j'ai eu des soucis analogue en important QtGui avant QtWidgets. De là mes paramétrages visuels (ex QtAligment) ne fonctionnent plus (en fait ils sont refusés dans le setAlignement car eux-aussi ne sont pas du bon type). Il semble que QtWidgets doive explicitement être placé en premier (ensuite les deux autres ça semble moins problématique).

    [edit]on peut modifier le second exemple ainsi...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from PySide6.QtCore import *
    from PySide6.QtWidgets import (QSlider, QWidget)
    ...et là aussi ça donne le bon résultat. En fait le souci semble venir de l'étoile à l'import.

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 885
    Points : 7 233
    Points
    7 233
    Par défaut
    Citation Envoyé par Sve@r
    Ca donne "True". On retombe sur un cas qui fonctionne.
    Alors dans l'ordre des importations qui retournaient False, ça retourne True si on importe d'une certaine façon.

    Je pense qu'en faisant from ... import * tu écrases certaines définitions importées du premier module (QtCore) par celles du second module (QtWidgets).

    C'est à mon avis un cas atypique et assez complexe lié à des détails d'implémentation internes des modules PySide6.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    C'est à mon avis un cas atypique et assez complexe lié à des détails d'implémentation internes des modules PySide6.
    Ouaip. Il me semble que tu m'avais sermonné une fois sur le fait que tu n'aimais pas import * dans PyQt...

    Je viens de commencer à traiter un premier petit projet (que j'avais fait en PyQt5 puis porté en PyQt6 et en PySide6) et j'ai remplacé tous les import * par des imports explicites et individuels. Là ça remarche (et l'ordre n'a plus d'importance) mais il va me falloir le faire maintenant de façon systématique

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 885
    Points : 7 233
    Points
    7 233
    Par défaut
    Citation Envoyé par Sve@r
    Il me semble que tu m'avais sermonné une fois sur le fait que tu n'aimais pas import * dans PyQt...
    Oui c'est possible mais pas forcément pour cette raison...

    Cette pratique peut rendre le code moins lisible car il devient difficile de déterminer quel nom vient de quel module. La PEP 8 conseille de privilégier des importations explicites pour maintenir la clarté du code.

    Les bonnes pratiques c'est d'éviter le plus possible ce genre de notation.

  7. #7
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 195
    Points : 4 648
    Points
    4 648
    Par défaut
    bonjour

    étrange ...

    J'ai fait le test avec le pyside de mon système : 6.6.2 et ... pas de problème, même résultat (True) avec les 2 versions.

    En venv avec 6.7 (qui vient de sortir), même problème que toi et bizarrement quel que soit l'ordre (et la version) j'ai avec print(QSlider.__mro__)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (<class 'PySide6.QtWidgets.QSlider'>, <class 'PySide6.QtWidgets.QAbstractSlider'>, <class 'PySide6.QtWidgets.QWidget'>, <class 'PySide6.QtCore.QObject'>, <class 'PySide6.QtGui.QPaintDevice'>, <class 'Shiboken.Object'>, <class 'object'>)
    Note: avec 6.6 et 6.7 nous avons le même __init__.py, donc difficile de voir ce qui se passe.


    ---------------------
    ---------------------

    Par contre, si je fais un print(len(QWidget.__subclasses__()), QWidget.__subclasses__()) alors l'ordre des 2 imports change tout
    ps: dans tous les cas, j'ai "PySide6.QtWidgets.QAbstractSlider"

    False -> 18 classes (dérivées de QWidget)
    True -> 28 classes (dérivées de QWidget)

    ALORS QUE avec 6.6 quel que soit l'ordre d'import, j'ai : 27 classes (dérivées de QWidget)

    ---------------------
    ---------------------

    EDIT:
    Trouvé à https://wiki.qt.io/Qt_for_Python_Development_Notes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    11. April 2024
     * Bugs & Features
     
    PYSIDE-2675 Addressing the lazy import issues that were found in 6.7.0 :
     - Studying the possible solution, but it needs to consider other cases as well.
     - the *-import handling seems to be related, and affecting the mro content, duplicating some entries.
     - the type discovery handler might be related as well

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par papajoker Voir le message
    ALORS QUE avec 6.6 quel que soit l'ordre d'import, j'ai : 27 classes (dérivées de QWidget)
    En effet, j'ai commencé à avoir des soucis suite à une mise à jour.

    Citation Envoyé par papajoker Voir le message
    Trouvé à https://wiki.qt.io/Qt_for_Python_Development_Notes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    11. April 2024
     * Bugs & Features
     
    PYSIDE-2675 Addressing the lazy import issues that were found in 6.7.0 :
     - Studying the possible solution, but it needs to consider other cases as well.
     - the *-import handling seems to be related, and affecting the mro content, duplicating some entries.
     - the type discovery handler might be related as well
    Ok, c'est donc un bug. Merci de ton investissement

    De mon côté j'ai commencé à reprendre mes codes et remplacer "*" par le détail des widgets utilisés (j'étais d'accord avec fred1599 la dernière fois qu'il en avait parlé mais j'avais la flemme, là ça m'a donné le coup de pied au luc qu'il me fallait).
    Heureusement que pylint indique les imports inutiles parce qu'avec le copier/coller il y en avait pas mal de résiduels.

  9. #9
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 195
    Points : 4 648
    Points
    4 648
    Par défaut
    Pour le nouveau "Lazy imports" de v6.7, qt en parle dans cette page "Lazy imports to improve the startup time"
    Si le gain est si bon qu'ils le prétendent, alors pas de problème pour éradiquer les import *

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

Discussions similaires

  1. Ordre des conditions dans une clause WHERE, important ou pas en 2012 ?
    Par clavier12AZQSWX dans le forum Langage SQL
    Réponses: 5
    Dernier message: 07/03/2012, 11h54
  2. Importance de l'ordre des champs dans un Group by ?
    Par Noren dans le forum Langage SQL
    Réponses: 1
    Dernier message: 15/12/2007, 13h31
  3. [Portal 9iAS] : ordre des items dans une région
    Par melitta dans le forum Oracle
    Réponses: 8
    Dernier message: 21/10/2004, 14h01
  4. Ordre des tests dans la clause WHERE
    Par Tans98 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 22/09/2004, 10h52
  5. Ordre des champs dans une table
    Par patapetz dans le forum Outils
    Réponses: 5
    Dernier message: 30/07/2003, 06h53

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