Why does Python's eval(input(“Enter input: ”)) change input's datatype?










5















In Python 3, I write a simple command to accept an integer input from the user thus:



x = int(input("Enter a number: "))


If I skip the int() part and simply use x = input("Enter a number: "), my input's datatype is a string, not an integer. I understand that.



However, if I use the following command:



x = eval(input("Enter a number: "))


the input's datatype is 'int'.



Why does this happen?










share|improve this question
























  • maybe it is a dynamic type check when you use eval()?

    – cssGEEK
    Jun 19 '16 at 19:12






  • 1





    eval treats the input like it was written in code, doing x = 3 in code makes an integer, so x = eval("3") will also make x an integer, however letting the user enter arbitrary code as their input can be a huge problem, if they typed in open(__file__,'w').close() it would delete the current executing file.

    – Tadhg McDonald-Jensen
    Jun 19 '16 at 19:18















5















In Python 3, I write a simple command to accept an integer input from the user thus:



x = int(input("Enter a number: "))


If I skip the int() part and simply use x = input("Enter a number: "), my input's datatype is a string, not an integer. I understand that.



However, if I use the following command:



x = eval(input("Enter a number: "))


the input's datatype is 'int'.



Why does this happen?










share|improve this question
























  • maybe it is a dynamic type check when you use eval()?

    – cssGEEK
    Jun 19 '16 at 19:12






  • 1





    eval treats the input like it was written in code, doing x = 3 in code makes an integer, so x = eval("3") will also make x an integer, however letting the user enter arbitrary code as their input can be a huge problem, if they typed in open(__file__,'w').close() it would delete the current executing file.

    – Tadhg McDonald-Jensen
    Jun 19 '16 at 19:18













5












5








5


2






In Python 3, I write a simple command to accept an integer input from the user thus:



x = int(input("Enter a number: "))


If I skip the int() part and simply use x = input("Enter a number: "), my input's datatype is a string, not an integer. I understand that.



However, if I use the following command:



x = eval(input("Enter a number: "))


the input's datatype is 'int'.



Why does this happen?










share|improve this question
















In Python 3, I write a simple command to accept an integer input from the user thus:



x = int(input("Enter a number: "))


If I skip the int() part and simply use x = input("Enter a number: "), my input's datatype is a string, not an integer. I understand that.



However, if I use the following command:



x = eval(input("Enter a number: "))


the input's datatype is 'int'.



Why does this happen?







python eval type-conversion






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jun 19 '16 at 19:26







lebowski

















asked Jun 19 '16 at 19:07









lebowskilebowski

388320




388320












  • maybe it is a dynamic type check when you use eval()?

    – cssGEEK
    Jun 19 '16 at 19:12






  • 1





    eval treats the input like it was written in code, doing x = 3 in code makes an integer, so x = eval("3") will also make x an integer, however letting the user enter arbitrary code as their input can be a huge problem, if they typed in open(__file__,'w').close() it would delete the current executing file.

    – Tadhg McDonald-Jensen
    Jun 19 '16 at 19:18

















  • maybe it is a dynamic type check when you use eval()?

    – cssGEEK
    Jun 19 '16 at 19:12






  • 1





    eval treats the input like it was written in code, doing x = 3 in code makes an integer, so x = eval("3") will also make x an integer, however letting the user enter arbitrary code as their input can be a huge problem, if they typed in open(__file__,'w').close() it would delete the current executing file.

    – Tadhg McDonald-Jensen
    Jun 19 '16 at 19:18
















maybe it is a dynamic type check when you use eval()?

– cssGEEK
Jun 19 '16 at 19:12





maybe it is a dynamic type check when you use eval()?

– cssGEEK
Jun 19 '16 at 19:12




1




1





eval treats the input like it was written in code, doing x = 3 in code makes an integer, so x = eval("3") will also make x an integer, however letting the user enter arbitrary code as their input can be a huge problem, if they typed in open(__file__,'w').close() it would delete the current executing file.

– Tadhg McDonald-Jensen
Jun 19 '16 at 19:18





eval treats the input like it was written in code, doing x = 3 in code makes an integer, so x = eval("3") will also make x an integer, however letting the user enter arbitrary code as their input can be a huge problem, if they typed in open(__file__,'w').close() it would delete the current executing file.

– Tadhg McDonald-Jensen
Jun 19 '16 at 19:18












2 Answers
2






active

oldest

votes


















5















Why does this happen?




x = eval(input("Enter a number: ")) is not the same thing as x = eval('input("Enter a number: ")')



The former first calls input(...), gets a string, e.g. '5' then evaluates it, that's why you get an int, in this manner:



>>> eval('5') # the str '5' is e.g. the value it gets after calling input(...)
5 # You get an int


While the latter (more aligned with what you were expecting), evaluates the expression 'input("Enter a number: ")'



>>> x = eval('input("Enter a number: ")')
Enter a number: 5
>>> x
'5' # Here you get a str





share|improve this answer
































    0














    Because a number is a valid expression in Python, and it evaluates to itself (and its type is int). For example, if you input a rubbish string with a non-existing name (say, 'abcdefgh'), a NameError exception will be raised (the exception is raised while evaluating).






    share|improve this answer






















      Your Answer






      StackExchange.ifUsing("editor", function ()
      StackExchange.using("externalEditor", function ()
      StackExchange.using("snippets", function ()
      StackExchange.snippets.init();
      );
      );
      , "code-snippets");

      StackExchange.ready(function()
      var channelOptions =
      tags: "".split(" "),
      id: "1"
      ;
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function()
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled)
      StackExchange.using("snippets", function()
      createEditor();
      );

      else
      createEditor();

      );

      function createEditor()
      StackExchange.prepareEditor(
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader:
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      ,
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      );



      );













      draft saved

      draft discarded


















      StackExchange.ready(
      function ()
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f37910827%2fwhy-does-pythons-evalinputenter-input-change-inputs-datatype%23new-answer', 'question_page');

      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      5















      Why does this happen?




      x = eval(input("Enter a number: ")) is not the same thing as x = eval('input("Enter a number: ")')



      The former first calls input(...), gets a string, e.g. '5' then evaluates it, that's why you get an int, in this manner:



      >>> eval('5') # the str '5' is e.g. the value it gets after calling input(...)
      5 # You get an int


      While the latter (more aligned with what you were expecting), evaluates the expression 'input("Enter a number: ")'



      >>> x = eval('input("Enter a number: ")')
      Enter a number: 5
      >>> x
      '5' # Here you get a str





      share|improve this answer





























        5















        Why does this happen?




        x = eval(input("Enter a number: ")) is not the same thing as x = eval('input("Enter a number: ")')



        The former first calls input(...), gets a string, e.g. '5' then evaluates it, that's why you get an int, in this manner:



        >>> eval('5') # the str '5' is e.g. the value it gets after calling input(...)
        5 # You get an int


        While the latter (more aligned with what you were expecting), evaluates the expression 'input("Enter a number: ")'



        >>> x = eval('input("Enter a number: ")')
        Enter a number: 5
        >>> x
        '5' # Here you get a str





        share|improve this answer



























          5












          5








          5








          Why does this happen?




          x = eval(input("Enter a number: ")) is not the same thing as x = eval('input("Enter a number: ")')



          The former first calls input(...), gets a string, e.g. '5' then evaluates it, that's why you get an int, in this manner:



          >>> eval('5') # the str '5' is e.g. the value it gets after calling input(...)
          5 # You get an int


          While the latter (more aligned with what you were expecting), evaluates the expression 'input("Enter a number: ")'



          >>> x = eval('input("Enter a number: ")')
          Enter a number: 5
          >>> x
          '5' # Here you get a str





          share|improve this answer
















          Why does this happen?




          x = eval(input("Enter a number: ")) is not the same thing as x = eval('input("Enter a number: ")')



          The former first calls input(...), gets a string, e.g. '5' then evaluates it, that's why you get an int, in this manner:



          >>> eval('5') # the str '5' is e.g. the value it gets after calling input(...)
          5 # You get an int


          While the latter (more aligned with what you were expecting), evaluates the expression 'input("Enter a number: ")'



          >>> x = eval('input("Enter a number: ")')
          Enter a number: 5
          >>> x
          '5' # Here you get a str






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Jun 19 '16 at 19:18

























          answered Jun 19 '16 at 19:12









          bakkalbakkal

          41.5k98286




          41.5k98286























              0














              Because a number is a valid expression in Python, and it evaluates to itself (and its type is int). For example, if you input a rubbish string with a non-existing name (say, 'abcdefgh'), a NameError exception will be raised (the exception is raised while evaluating).






              share|improve this answer



























                0














                Because a number is a valid expression in Python, and it evaluates to itself (and its type is int). For example, if you input a rubbish string with a non-existing name (say, 'abcdefgh'), a NameError exception will be raised (the exception is raised while evaluating).






                share|improve this answer

























                  0












                  0








                  0







                  Because a number is a valid expression in Python, and it evaluates to itself (and its type is int). For example, if you input a rubbish string with a non-existing name (say, 'abcdefgh'), a NameError exception will be raised (the exception is raised while evaluating).






                  share|improve this answer













                  Because a number is a valid expression in Python, and it evaluates to itself (and its type is int). For example, if you input a rubbish string with a non-existing name (say, 'abcdefgh'), a NameError exception will be raised (the exception is raised while evaluating).







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Jun 19 '16 at 19:12









                  Pavel GurkovPavel Gurkov

                  564413




                  564413



























                      draft saved

                      draft discarded
















































                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid


                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.

                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function ()
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f37910827%2fwhy-does-pythons-evalinputenter-input-change-inputs-datatype%23new-answer', 'question_page');

                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

                      Edmonton

                      Crossroads (UK TV series)