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 :

Impasse avec : TypeError: 'dict' object is not callable [Python 3.X]


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    débutant
    Inscrit en
    Septembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : débutant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2017
    Messages : 12
    Points : 8
    Points
    8
    Par défaut Impasse avec : TypeError: 'dict' object is not callable
    Bonjour.

    Ceci est mon tout premier message sur ce forum et j'espère avant toute chose n'enfreindre aucune règle que ce soit. Je suis super débutant en langage Python, j'apprends (avec du mal) au jour le jour. Pour bien faire, j'essaie de me créer mes propres petits programmes selon ce que j'ai appris et je bloque totalement sur une partie de mon exercice du moment.

    J'essaie de créer un petit programme qui calcule le temps de trajet nécessaire pour voyager vers la lune, selon un mode de transport défini par l'utilisateur (je sais ce n'est pas hyper réaliste...).
    Pour se faire je crée dans une fonction un dictionnaire "vitesse" qui stocke des valeurs (vitesses moyennes) associées aux modes de transport. Cependant dans ma fonction j'aimerais inclure une opération qui appelle une valeur du dictionnaire via : "temps_trajet = distance / vehicule()" en fonction de ce que l'utilisateur choisira comme mode de transport, mais bien entendu cela me renvoie une erreur "TypeError: 'dict' object is not callable".

    Même si je comprends à peu près l'erreur en question, je ne comprends pas pourquoi, ni comment... en fait je ne comprends plus rien. Je ne sais pas si je suis assez clair, mais toute aide serait la bienvenue pour m'aider à comprendre, et/ou résoudre mon petit bout de code s'il vous plaît. En vous remerciant par avance, voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def lune_transport():
    	print("""Choisis maintenant ton mode de transport : A-tes pieds, B-un velo,
              C-une voiture, D-un petit avion a helice, E-une navette spaciale ou F-un teleporteur : """)
     
    	vitesse = {"A":5, "B":20, "C":130, "D":300, "E":40000}
    	vehicule = str(sys.stdin.readline())
    	distance = 384400
    	temps_trajet = distance / vehicule()
    	print(temps_trajet)
     
    lune_transport()

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par dustman Voir le message
    je ne comprends pas pourquoi, ni comment... en fait je ne comprends plus rien.
    Il n'y a rien à comprendre: les objets qu'on manipule en programmation ne sont que des constructions humaines... vous ne pouvez que prendre du temps pour apprendre à vous en servir et vous poser de bonnes questions!
    Partons de vitesse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> vitesse = {"A":5, "B":20, "C":130, "D":300, "E":40000}
    >>>
    C'est l'association entre une clef A, B, C, D, E représentant le véhicule et sa vitesse.
    Et donc la question est de comment récupérer cette foutue vitesse lorsque l'utilisateur à tapé "B" (par exemple) et ouvrir votre tuto préféré au chapitre qui parle des dictionnaires....
    Et d'essayer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> vitesse['B']
    20
    >>>
    pour voir si vous avez compris...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Futur Membre du Club
    Homme Profil pro
    débutant
    Inscrit en
    Septembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : débutant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2017
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Salut,

    Merci beaucoup d'avoir pris le temps de me répondre. Je vais me documenter encore un peu sur les dictionnaires alors... et continuer à réfléchir.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    débutant
    Inscrit en
    Septembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : débutant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2017
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Re-bonjour,

    Bon j'avoue, je sèche totalement... je me complique la tâche et je me rends compte que je suis parti avec une erreur dans mon code dès le départ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    temps_trajet = distance / vehicule()
    puisque ce que je souhaite, c'est que lorsque l'utilisateur rentre une clé, ["B"] pour garder l'exemple, cette clé puisse être appelée dans mon opération :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    temps_trajet = distance / vitesse
    Je sais comment appeler ["B"] ou n'importe quelle autre clé manuellement bien sûr, mais je ne sais pas comment l'inclure dans une opération et afficher le résultat de cette opération. Je me doute que la solution doit être simple, mais je dois manquer cruellement de logique pour le moment pour la trouver.

    J'ai essayé de revoir totalement mon code, en le compliquant avec tas de fonctions pour éviter de passer par un dictionnaire, pour voir, et je retombe sur le même problème ou presque.

    Je ne pense pas y arriver davantage à ce stade, si vous avez la solution, n'hésitez pas à la poster s'il vous plaît cela m'aiderait à comprendre, car je commence à griller mes neurones dans le vent... .

    Encore merci.
    Merci d'avance.

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 054
    Points : 9 393
    Points
    9 393
    Par défaut
    Reprenons ton programme. Tu as mis des noms de variables très explicites, parfait. Ligne 8, tu dis que la durée est égale à la distance divisée par le véhicule ? Non, une durée est égale à une distance divisée par une vitesse.

    Ici, tu as initialisé en ligne 5 la vitesse de chaque véhicule, ok. Tu as stocké cela dans un truc qui s'appelle vitesse (un tableau, une liste, un dictionnaire ... ou je ne sais quoi). Tu aurais pu initialiser aussi le prix ou la puissance de chaque véhicule dans un autre tableau. Si ensuite tu veux utiliser la vitesse, il faut forcément que tu réutilises ce mot vitesse.

    Et donc en ligne 8, tu devrais avoir un truc comme ça :

    duree = distance /vitesse[vehicule]
    ou
    duree = distance / vehicule.vitesse
    ou ... ou ...
    Je ne sais pas quelle est la bonne syntaxe, mais forcément on doit retrouver le mot vitesse.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    débutant
    Inscrit en
    Septembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : débutant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2017
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    En effet, c'est pour ça que je reprenais moi-même mon erreur. Mon code pour l'instant est donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def lune_transport():
    	print("""Choisis maintenant ton mode de transport : A-tes pieds, B-un velo,
              C-une voiture, D-un petit avion a helice, E-une navette spaciale ou F-un teleporteur : """)
     
    	vitesse = {"A":5, "B":20, "C":130, "D":300, "E":40000}
    	distance = 384400
    	vehicule = str(sys.stdin.readline())
    	temps_trajet = distance / vitesse
    	print(temps_trajet)
     
     
    lune_transport()

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par dustman Voir le message
    J'ai essayé de revoir totalement mon code, en le compliquant avec tas de fonctions pour éviter de passer par un dictionnaire, pour voir, et je retombe sur le même problème ou presque.

    Je ne pense pas y arriver davantage à ce stade, si vous avez la solution, n'hésitez pas à la poster s'il vous plaît cela m'aiderait à comprendre, car je commence à griller mes neurones dans le vent... .
    Plutôt que d'essayer d'écrire du code vous devriez passer du temps à jouer avec la console Python.
    Un truc comme 'B' est une chaîne de caractères (sous forme littérale) et donc affiche moi la valeur associée à cette clef là:
    mais ce qui a été saisi par l'utilisateur et qui est retourné par str(sys.stdin.readline()) a été assigné à la variable vehicule.
    Il serait logique d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> vehicule = 'B'
    >>> vitesse[vehicule]
    20
    mais dans votre cas, çà va planter avec "KeyError" car vehicule contient bien plus que 'B'.
    Dans les tutos on apprend aux débutants à faire des saisies avec "input"... car il ne sont pas supposés déjà connaître "import", "sys", "stdin",.... et ont plein de choses à apprendre avant qu'on leur raconte comment utiliser tout çà.
    Vouloir griller les étapes, pour se faire de nœuds au cerveau? Vous voyez bien que çà fonctionne très moyen...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Futur Membre du Club
    Homme Profil pro
    débutant
    Inscrit en
    Septembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : débutant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2017
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Je comprends. J'ai justement commencé à apprendre "input" via la méthode Swinnen, pour finalement découvrir "sys.stind.readline" via "Python pour les kids" (oui j'en suis là...). Sauf que "input" ne fonctionne pas dans mon code.

    J'ai pas mal joué avec la console Python et les notions de base telles que chaînes de caractères, variables, fonction, entier, float, etc. sont acquises (enfin c'est ce que je pensais).

    Bref tout ça pour dire, que ce n'est pas en lisant des manuels et en mettant la main dans l'eau qu'on apprend à nager, il faut aussi se jeter à l'eau. C'est pourquoi je me crée ce genre de défi mais en bon débutant que je suis, pour ne pas me noyer, j'ai besoin de bouées de sauvetage.

  9. #9
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 054
    Points : 9 393
    Points
    9 393
    Par défaut
    Une des règles, c'est de bien identifier le plantage. Et mon leitmotiv, c'est qu'il faut DECOMPOSER.
    Ce que tu peux faire, c'est remplacer l'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vehicule = str(sys.stdin.readline())
    par
    A partir de là, tu débuggues ton programme, pour qu'il affiche la durée correctement. Ensuite, tu t'attaques à l'interface utilisateur. Comment faire en sorte de passer un paramètre à ce programme.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par dustman Voir le message
    Bref tout ça pour dire, que ce n'est pas en lisant des manuels et en mettant la main dans l'eau qu'on apprend à nager, il faut aussi se jeter à l'eau. C'est pourquoi je me crée ce genre de défi mais en bon débutant que je suis, pour ne pas me noyer, j'ai besoin de bouées de sauvetage.
    Apprendre à lancer la console Python pour regarder ce qu'il se passe, n'est pas un défi, c'est la base!
    J'assigne à vehicule le retour d'input:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> vehicule = input('? ')
    ? B
    Je vérifie que vehicule contient bien ce que j'attends:
    Je récupère la valeur associée à la clef 'B' dans le dictionnaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> vitesse[vehicule]
    20
    Vous avez la chance d'apprendre un langage interprété - c'est la possibilité de taper des commandes qui seront exécutées immédiatement- . Et apprendre un langage, c'est s'assurer que l'autre (ici, Python) comprend les instructions que vous lui donnez et que réciproquement vous comprenez ce qu'il va faire si vous ordonnez de...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Futur Membre du Club
    Homme Profil pro
    débutant
    Inscrit en
    Septembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : débutant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2017
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Alors merci beaucoup pour votre patience à tous les deux, je crois que j'ai compris ! En procédant ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def lune_transport():
    	print("""Choisis maintenant ton mode de transport : A-tes pieds, B-un velo,
              C-une voiture, D-un petit avion a helice, E-une navette spaciale ou F-un teleporteur : """)
     
    	vitesse = {"A":5, "B":20, "C":130, "D":300, "E":40000}
    	distance = 384400
    	vehicule = input() #Python demande à l'utilisateur de rentrer une donnee qu'il associera a "vehicule"
    	temps_trajet = distance / vitesse[vehicule] 
    	#vehicule etant maintenant associee a une cle de "vitesse", vitesse[vehicule] appelle la cle rentree par l'utilisateur
     
     
    	print(temps_trajet)
     
    lune_transport()

    cela fonctionne. Je ne comprenais pas comment vitesse[vehicule] pouvait fonctionner et effectivement, en décomposant comme il faut on comprend mieux.

    Merci de m'avoir aidé et merci pour vos conseils !

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

Discussions similaires

  1. TypeError: 'module' object is not callable
    Par dedalios dans le forum Général Python
    Réponses: 1
    Dernier message: 08/09/2017, 18h41
  2. Réponses: 2
    Dernier message: 05/12/2016, 13h47
  3. [THREAD] TypeError: NoneType' object is not callable
    Par flolebreton dans le forum Général Python
    Réponses: 2
    Dernier message: 24/06/2013, 14h49
  4. Réponses: 2
    Dernier message: 01/04/2011, 09h20
  5. TypeError: 'file' object is not callable
    Par MariemEA dans le forum Général Python
    Réponses: 7
    Dernier message: 09/07/2010, 21h57

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