Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Règles prédéfinies pour certains champs

0 votes

Je serai amené à développer une application de saisie/analyse de données scientifiques.

Je bute sur un problème lors de l'affichage de ces données.

Pour chaque champ j'aurai besoin d'afficher une sorte de note si une ou plusieurs conditions réunies.

Par ex Taux de xx est très élevé si la valeur est supérieure à 10.

J'aimerais éviter de coder ça en dur.

demandé 5-Jul-2015 par neverdown (104 points)
edité 14-Jul-2015 par foxmask

C'est quoi la question ? Vérifier une condition sans coder de condition :O ?

Mais de le faire de façon dynamique.
Que chaque champ ait sa propre règle.
Et de les ajouter facilement au lieu de les coder en dur.

faut un peu de code pour mieux y comprendre, je ne vois vraiment pas ce que tu essayes de faire...

En n'ayant pas plus de détails, je partirai sur une table de jointure fields <=> rules où un champ a une règle de gestion.
Les "règles" se définiraient dans l'admin django.
Les liaisons "champs <=> règles" aussi.
Du coup dans le formulaire on aurait les infos voulues en chargeant les règles de gestion depuis l'init du formulaire.

Poste les liens qui ne marchent pas spécifiquement.

1 Réponse

+3 votes

Question très vague, réponse imprécise.

Ne pas coder en dur quelque chose reviens à le déduire d'autres propriétés, par exemple du contenu d'un fichier dont le nom est connu.

Sinon, plus simple : des fonctions généralistes (mais avec des décorateurs, c'est plus pythonique) qui font l'interprétation pour ce qu'on leur donne.

taux['xx'] = input('xx: ')
taux['yy'] = input('yy: ')
print(taux['xx'])  # basique

def human_readable_level(x, threshold_low=2, threshold_high=10):
    if x < threshold_low: return "c'est tout piti !"
    elif x > threshold_high: return 'très élevé'
    return 'ça va'

print(taux['xx'], human_readable_level(taux['xx']))  # plus cool
print(taux['yy'], human_readable_level(taux['yy'], threshold_low=0))  # avec cas particulier

En python 3, on peut utiliser l'incroyable ChainMap et son acolyte le default dict:

from collections import ChainMap, defaultdict


THRESHOLD_LOW = ChainMap(
    {  # cas particuliers
        'yy': 0,
    },
    defaultdict(lambda: 2)  # cas général
)

THRESHOLD_HIGH = ChainMap(
    {  # cas particuliers
        'zz': 42,
        'yy': 31,
    },
    defaultdict(lambda: 10)  # cas général
)



def human_readable_level(taux, x):
    if taux[x] < THRESHOLD_LOW[x]:
        return "c'est tout piti !"
    elif taux[x] > THRESHOLD_HIGH[x]:
        return "c'est énoooorme !"
    return 'ça va'

taux = {'xx': 3, 'yy': 32, 'zz': 1}
for x in ('xx', 'yy', 'zz'):
    print(taux[x], x, human_readable_level(taux, x))
répondu 6-Jul-2015 par lucas (2,326 points)
edité 4-Sep-2015 par lucas

Perso j'aurais nommé la variable "highlevel" plutôt avec un nom du genre "seuilmaxi" c'est plus explicite =D.

+1 pour l'idée d'utiliser une fonction, j'avais aussi penser à refourguer ça dans une fonction qu'on utilisera pour chaque champ mais vu que la question est sujette à ambiguïtées, j'ai préféré ne rien proposer jusqu'à en savoir plus sur l'intention de l'auteur du post.

Dans le sens où il faut qu'il précise qu'est-ce qu'il attend par

éviter de coder en dur

Genre coder un truc une fois et ensuite le réutiliser dans plusieurs cas différents ?

En attendant je plussoie à 100% :

Question très vague, réponse imprécise.

+1.
J'ai modifié la réponse pour prendre en compte tes propositions, ou mieux les mettre en avant.

...