Si les modules en question sont chargés, si, ils peuvent s'ajouter tous seuls sans problème.

Mais si rien dans le reste du code ne les importe, comment on les charge?
Elzen a écritMais si rien dans le reste du code ne les importe, comment on les charge?
Y’a pas de magie : va falloir charger le code à un moment (même en C ou C++, quand tu fais des plugin à un moment tu les charges avec dlopen).
importlib devrait te permettre de faire ça (via import_module peut-être).
Sinon j’ai regardé _data.py (un peu moins en détails que _base.py)

Tu pourrais avoir une classe abstraite à la base de tout ça (cf. abc).
Même si c’est pas obligatoire en Python ça rendrait le code plus sûr (y'aurait pas d’oubli d’implémenter une méthode requise) et ça permettrait de factoriser un peu le code (genre label pourrait être dans la classe de base).
Ça permettrait aussi de documenter ton interface (parce que là, le booléen renvoyé par la méthode prepare je n‘ai aucune idée de son rôle (ça viendra sûrement en lisant le reste du code, mais je devrais pas avoir à faire ça pour comprendre normalement)).


Pourquoi
sys.modules["_base"]
plusieurs fois au lieu de faire un simple import _base.
Je suppose que c’est liée à une des remarques de mon message précédent (à propos du code qui traîne en dehors de toute fonctions).

while parent.get_parent() is not None: parent = parent.get_parent()
Ça c’est moche sérieusement, le while sur une ligne (j’ai vu que tu le faisais pour les if/else et c’est déjà pas terrible, mais le while…)

if value is not None and value != "":
Ça pourrait être if value tout simplement je pense

for i in range(len(combo.get_model())):
    if combo.get_model()[i][0] == value:
        combo.set_active(i)
Tu pourrais utiliser enumerate ici:
for idx, val in enumerate(combo.get_model()):
    if val[0] == value:
        combo.set_active(idx)

Ce genre de trucs
wv.load_uri(url); scroll.add(wv)
et
try: entry.set_text(sys.modules["_base"].savecoords(wv.get_uri()))
except Exception: pass
C‘est aussi très très moyen, surtout que tu le fait de manière aléatoire on dirait (du coup c'est moche ET pas cohérent…).
Les virgules aussi (un coup y’ une espace après, et des fois non…).
Ça aide vraiment pas à lire le code (un code qui n’a pas de cohérence est difficile à suivre : la forme empêche de se concentrer sur le fond) :/
grim7reaper a écrit
Elzen a écritMais si rien dans le reste du code ne les importe, comment on les charge?
Y’a pas de magie : va falloir charger le code à un moment (même en C ou C++, quand tu fais des plugin à un moment tu les charges avec dlopen).
importlib devrait te permettre de faire ça (via import_module peut-être).
Je vais creuser de ce côté, merci 🙂
grim7reaper a écritTu pourrais avoir une classe abstraite à la base de tout ça (cf. abc).
Même si c’est pas obligatoire en Python ça rendrait le code plus sûr (y'aurait pas d’oubli d’implémenter une méthode requise) et ça permettrait de factoriser un peu le code (genre label pourrait être dans la classe de base).
Ça permettrait aussi de documenter ton interface (parce que là, le booléen renvoyé par la méthode prepare je n‘ai aucune idée de son rôle (ça viendra sûrement en lisant le reste du code, mais je devrais pas avoir à faire ça pour comprendre normalement)).
Je n'avais encore jamais creusé la façon dont faire des classes abstraites/interfaces en Python. Ça me semble une bonne occasion de m'y mettre 🙂

(Ceci dit, je vais vraisemblablement changer quelques trucs à la façon de fonctionner actuelle: le fait qu'il y ait besoin de passer par une table supplémentaire pour paramétrer des options (seulement pour le choix multiple, actuellement, mais si on rajoute des types…) ne me satisfait pas des masses. Je pense que je tâcherai de mettre les éventuelles options dans la même colonne que la définition du type, ce sera plus souple à l'usage).
grim7reaper a écritPourquoi
sys.modules["_base"]
plusieurs fois au lieu de faire un simple import _base.
Je suppose que c’est liée à une des remarques de mon message précédent (à propos du code qui traîne en dehors de toute fonctions).
Je n'ai encore rien eu le temps de modifier depuis ton message précédent.

À la base, il me semble que c'était un problème d'ordre des imports, dû au fait que _data et _base se chargent l'un-l'autre. Comme je n'aime pas mettre des import à des endroits arbitraires du code (autres qu'au début, s'entend), j'avais fait ça pour contourner. Ce sera corrigé au moment où je referai proprement la découpe.
grim7reaper a écrit
if value is not None and value != "":
Ça pourrait être if value tout simplement je pense
Je n'ai pas assez l'habitude de tester autre chose que des booléens 🙂 Je sais que None est considéré comme faux, mais je n'y pense jamais pour 0 et "".
grim7reaper a écrit
for i in range(len(combo.get_model())):
    if combo.get_model()[i][0] == value:
        combo.set_active(i)
Tu pourrais utiliser enumerate ici:
for idx, val in enumerate(combo.get_model()):
    if val[0] == value:
        combo.set_active(idx)
Tiens, je n'avais jamais remarqué enumerate… C'est vrai que c'est largement mieux.

Je suis d'accord pour les remarques sur la forme, je vais corriger tout ça (dès que j'aurai un brin de temps).
/me a vu la lumière et pousse la porte
Bon je vais squatter un peu dans le coin, j'avance tout doucement sur le python. D'ailleurs, si vous avez des conseils pour un programmeur en codeur en herbe, je suis preneur (comme je ne suis aucun cours, je cherche une sorte de roadmap pour m'organiser, dans le genre: listes d'exercices (classés par difficulté croissante) pour se faire la main, forum/chat pour les noobs, etc.).
Hey bienvenue !

Du sang neuf !
Slystone a écritsi vous avez des conseils pour un programmeur en codeur en herbe, je suis preneur
Hésite pas à poster ton code pour avoir des retours : ça évite de prendre de mauvaise habitudes quand on débutes et ça permets de découvrir certains trucs du langage plus rapidement (un exemple juste au dessus de ton message, avec enumerate 😉).
Sinon tu peux aussi utiliser Pylint sur ton code pour vérifier que tu respectes bien la PEP 8 (même si pylint est parfois plus royaliste que le roi, ça peut aider quand même).
Slystone a écritlistes d'exercices (classés par difficulté croissante) pour se faire la main
Project Euler et Rosalind sont sympa je trouve.
Slystone a écritforum/chat pour les noobs
chat : je ne sais pas.
forum : tu peux poser tes questions ici, ça fera vivre le topic 🙂
Merci pour l'accueil grim7reaper, et pour les conseils, t'es au top. 🙂
C'est la deuxième fois qu'on me parle du projet Euler, et Rosalind, de nom ça me dit quelque chose. Je les mets donc tout en haut de ma python_todo. \o/

J'ai un projet final: faire un quiz avec une base saine (pour que ce soit multiprotocol, multiplateforme, avec les bonnes meta-données pour chaque question (comme la date vu que le truc change tous les ans…). Bref, je me rends compte que je vais devoir cravacher pour sortir un truc propre et correct. ^^ Mais c'est une bonne excuse pour attaquer enfin la programmation sérieusement.
16 jours plus tard
Bon, puisque il faut poster son code, je vais m'y essayer :p
Ayant parlé plus haut du projet Euler, je m'y suis essayé. J'ai commencé par faire les problème le plus vite possible puis à partir du numéro 7, je me suis mis à essayer d'être plus fin. Aussi, n'étant ni mathématicien, ni informaticien, je n'ai nul doute que meilleur solution est possible tant côté mathématique que du côté du code. Qu 'à cela ne tienne ! avec votre aide je compte bien remédier à cela !
Si vous avez une solution plus habile ou une façon plus esthétique de coder, merci de partager 🙂
alors :
Trouver le 10001 nombre premier
méthode : commencer à 2, ajouter un nombre comme premier s'il n'est divisible par aucun nombre premier qui le précède.
number = 10001
c = 1
n = 2
prime = [2]

while c < number:
    n += 1
    for p in prime:
        if n%p == 0:
            break
        elif p == prime[-1]:
            prime.append(n)
            c += 1
print(prime[-1])
(tout simple donc)
maintenant, en dépit de la simplicité du problème suivant, (surtout par la méthode forte), je ne trouve pas la bonne solution.
Le but est de trouver le plus haut produit en utilisant n=13 chiffres contiguës d'un nombre à 1000 chiffres
Un exemple est donné avec n=4 -> 9*9*8*9 = 5832
Je suis parti sur un algorithme de complexité n, qui fonctionne pour n=4 mais ne marche pas pour n=13 🙁
ma méthode est la suivante :
utiliser des addition plutôt que des multiplication pour trouver la plus grande somme (et en retenir la position) ; il me semble que les additions sont moins coûteuses.
avancer en ajoutant le i (position) + n chiffre et en supprimant le i-1 pour avoir la somme de la position i. Si on rencontre un zéro, ne pas comptabiliser la somme puisque la multiplication serait nulle.
Malheureusement, il doit y avoir une erreur quelque part
#!/bin/python3

number1000digit = 7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450
nb = str(number1000digit)  # transformer numbre en tableau
digit = 13
somme = 0
sommeMax = 0
position = 0
zeros = []

# somme initiale
for i in range(digit):
    somme += int(nb[i])
    if int(nb[i]) == 0:
        zeros.append(i)
sommeMax = somme

# avancer dans le tableau
for i in range(1, len(nb)-digit):
    if int(nb[i + digit-1]) == 0:
        zeros.append(i + digit-1)
    if zeros and zeros[0] == i-1:
        del zeros[0]
    somme -= int(nb[i - 1])
    somme += int(nb[i + digit])
    if not zeros and somme > sommeMax:  # if no zeros in sum
        sommeMax = somme
        position = i

# multiply numbers starting at position
multiply = 1
for i in range(digit):
    multiply *= int(nb[i + position])
    print(nb[i + position], position)
print(multiply)
Oni_Shadow a écritméthode : commencer à 2, ajouter un nombre comme premier s'il n'est divisible par aucun nombre premier qui le précède.
Ça ressemble à la méthode des divisions successives, tu aurais aussi pu utiliser le crible d’Ératosthène.
Note que tu n’as pas besoin de tester tout les nombre premier qui le précède : pour tester N, tu peux te contenter de tester les nombres premiers ≤ √N.
Oni_Shadow a écritutiliser des addition plutôt que des multiplication pour trouver la plus grande somme (et en retenir la position) ; il me semble que les additions sont moins coûteuses.
Optimisation prématurée, et qui ne te donnera sûrement aucun gain en Python de toute façons. Ça va seulement rendre ton code moins lisible pour rien.
Ton code me semble compliqué.

Personnellement, je découperai le travail comme ça :
1. Découper le nombre en bloc de N chiffre : f("123456789", 4) => ["1234", "2345", "3456", "4567", "5678", "6789"].
2. Calculer le produit de chaque bloc.
3. Garder le maximum.

Ça tiens en 10 lignes de Python, mais je ne vais pas poster tout de suite, ça te spoilerai.
Je pense que tu n’es pas loin de la solution, mais tu as tellement compliqué ton code en essayant de l’optimiser (de la mauvaise façon) que tu as du rajouter des bugs en chemin.
Repart sur un truc plus simple et ça devrait le faire 😉
Elzen a écritGTK2 était une bonne bibliothèque. GTK3 en sera une quand ça arrêtera de casser les thèmes à chaque version
Et avec GTK4+ qui cassera l'API+ABI tous les 6 mois, c'est pas gagné 😛
Meanwhile, Gtk 4.0 will not be the final stable API of what we would call “Gtk 4”. Each 6 months, the new release (Gtk 4.2, Gtk 4.4, Gtk 4.6) will break API and ABI vs. the release that came before it. These incompatible minor versions will not be fully parallel installable; they will use the same pkg-config name and the same header file directory.
source


Oui, /me s'abonne au nouveau topic...
Et donc, si on veut une bonne bibli graphique autrement que pour expérimenter des trucs à durée de vie limitée, on reste sur GTK2, ou il y a d'autres choix potables? 😃
Mouais, pas convaincu.
En C++ c’est ignoble (moc…) dans les autres langages c’est la chiasse pour faire un binding (C++…) s’il existe pas déjà.
On arrive à faire d'excellents environnements et applications avec (genre, un petit desktop mal connu nommé KDE), donc ça doit pas être si ignoble que ça...
C’est pas un argument ça, on peut faire d’excellentes (et encore, c’est subjectif…) choses avec un langage perfectible™ et du code très moche. L’un n’empêche par l’autre.
Il n'y a nul besoin de rejeter un opinion sans arguments (cf. "c'est ignoble") avec guère plus que "Plein de gens l'utilisent depuis 15 ans et en sont très contents, y'a même plein de projets où les gens sont très contents de passer à Qt (exemple : Subsurface), ça doit pas être si mal que ça".
The Uploader a écritIl n'y a nul besoin de rejeter un opinion sans arguments (cf. "c'est ignoble")
Bah j’ai cité pourquoi je considérait que c’était ignoble en C++ : moc.
C’est pas le summum de l’élégance…
The Uploader a écrit"Plein de gens l'utilisent depuis 15 ans et en sont très contents, […], ça doit pas être si mal que ça".
On peut dire ça de [insérer ici un truc merdique utilisé par beaucoup de gens] aussi hein, et pourtant…

De toute façon, je pense pas qu‘il y ai besoin de se lancer dans un long débat stérile : Elzen à déjà essayé Qt et n’a pas été convaincu (Cf. premier message de la page précédente).
grim7reaper a écritBah j’ai cité pourquoi je considérait que c’était ignoble en C++ : moc.
C’est pas le summum de l’élégance…
Pourquoi ?
Et si ça marche bien, c'est si ignoble que ça ?
The Uploader a écrit
grim7reaper a écritBah j’ai cité pourquoi je considérait que c’était ignoble en C++ : moc.
C’est pas le summum de l’élégance…
Pourquoi ?
Parce qu’une bibliothèque qui t’impose de passer un préprocesseur sur ton code c’est très moche.
T’imagine si toute les bibliothèques étaient comme ça ?
The Uploader a écritEt si ça marche bien, c'est si ignoble que ça ?
Encore une fois, le fait que ça marche bien ne change rien au fait que ça soit dégueulasse.
Je peux écrire un programmes de 20 000 lignes en mettant tout dans la fonction main, ça va marcher mais ça sera toujours autant dégueulasse. L’un n’empêche pas l’autre.
Plutôt d'accord avec grim7reaper.

En ce qui me concerne, j'avais sûrement bloqué sur des trucs bêtes (je me souviens d'une histoire de composants auxquels on passait les conteneurs au lieu de l'inverse…), je retenterai un coup plus tard, pour voir. Mais en Python, 'faut pas délirer 🙂

N'empêche, dans les aspects très moches, il y a le fait que ça intègre un très bon rendu GTK2, mais qu'il y ait besoin de passer par gconf pour que ça accepte de charger le thème d'icônes qui va bien -_-

(Et j'n'ai pas suivi les derniers développements, mais, au moins jusqu'aux débuts de la version 4, KDE n'utilisait pas Qt, mais un truc maison basé dessus. C'est notamment pour ça que les applis KDE ne reconnaissaient pas la conf' Qt globale, mais avaient besoin qu'on passe par le panneau de conf' spécifique de KDE pour leurs réglages).


Puis, c'est quand même triste qu'on n'ait besoin de fouiller pour trouver plus de deux biblis graphiques et demi…