Validate IP4 address












7












$begingroup$


Validate IP Address



I got this problem during an interview. And would like to get some code review. I also wrote several tests with the expected output, and they all passed as expected.




Validate an IP address (IPv4). An address is valid if and only if it
is in the form "X.X.X.X", where each X is a number from 0 to 255.



For example, "12.34.5.6", "0.23.25.0", and "255.255.255.255" are valid
IP addresses, while "12.34.56.oops", "1.2.3.4.5", and
"123.235.153.425" are invalid IP addresses.




Examples:

"""

ip = '192.168.0.1'
output: true

ip = '0.0.0.0'
output: true

ip = '123.24.59.99'
output: true

ip = '192.168.123.456'
output: false
"""

def validateIP(ip):
#split them by '.' , and store them in an array
#check the array if the length is 4 length
arr = ip.split('.')
if len(arr) != 4:
return False
#0 check for special edge cases when non-digit
#1. check if they are digit,
#2. check if check the integer is between 0 and 255

for part in arr:
if len(part) > 1:
if part[0] == '0':
return False
if not part.isdigit():
return False
digit = int(part)
if digit < 0 or digit > 255:
return False
return True

#case#0

ip0="08.0.0.0" # False
test0= validateIP(ip0)
print(test0)

#case#1
ip1 = "192.168.0.1"
test1 = validateIP(ip1)
print(test1)

#case#2
ip2 = '0.0.0.0'
test2 = validateIP(ip2)
print(test2)

#case#3
ip3 = '123.24.59.99'
test3 = validateIP(ip3)
print(test3)

#case#4
ip4 = '192.168.123.456'
test4 = validateIP(ip4)
print(test4)

#case5
ip5 = "255.255.255.255"
test5 = validateIP(ip5)
print(test5)









share|improve this question











$endgroup$

















    7












    $begingroup$


    Validate IP Address



    I got this problem during an interview. And would like to get some code review. I also wrote several tests with the expected output, and they all passed as expected.




    Validate an IP address (IPv4). An address is valid if and only if it
    is in the form "X.X.X.X", where each X is a number from 0 to 255.



    For example, "12.34.5.6", "0.23.25.0", and "255.255.255.255" are valid
    IP addresses, while "12.34.56.oops", "1.2.3.4.5", and
    "123.235.153.425" are invalid IP addresses.




    Examples:

    """

    ip = '192.168.0.1'
    output: true

    ip = '0.0.0.0'
    output: true

    ip = '123.24.59.99'
    output: true

    ip = '192.168.123.456'
    output: false
    """

    def validateIP(ip):
    #split them by '.' , and store them in an array
    #check the array if the length is 4 length
    arr = ip.split('.')
    if len(arr) != 4:
    return False
    #0 check for special edge cases when non-digit
    #1. check if they are digit,
    #2. check if check the integer is between 0 and 255

    for part in arr:
    if len(part) > 1:
    if part[0] == '0':
    return False
    if not part.isdigit():
    return False
    digit = int(part)
    if digit < 0 or digit > 255:
    return False
    return True

    #case#0

    ip0="08.0.0.0" # False
    test0= validateIP(ip0)
    print(test0)

    #case#1
    ip1 = "192.168.0.1"
    test1 = validateIP(ip1)
    print(test1)

    #case#2
    ip2 = '0.0.0.0'
    test2 = validateIP(ip2)
    print(test2)

    #case#3
    ip3 = '123.24.59.99'
    test3 = validateIP(ip3)
    print(test3)

    #case#4
    ip4 = '192.168.123.456'
    test4 = validateIP(ip4)
    print(test4)

    #case5
    ip5 = "255.255.255.255"
    test5 = validateIP(ip5)
    print(test5)









    share|improve this question











    $endgroup$















      7












      7








      7


      2



      $begingroup$


      Validate IP Address



      I got this problem during an interview. And would like to get some code review. I also wrote several tests with the expected output, and they all passed as expected.




      Validate an IP address (IPv4). An address is valid if and only if it
      is in the form "X.X.X.X", where each X is a number from 0 to 255.



      For example, "12.34.5.6", "0.23.25.0", and "255.255.255.255" are valid
      IP addresses, while "12.34.56.oops", "1.2.3.4.5", and
      "123.235.153.425" are invalid IP addresses.




      Examples:

      """

      ip = '192.168.0.1'
      output: true

      ip = '0.0.0.0'
      output: true

      ip = '123.24.59.99'
      output: true

      ip = '192.168.123.456'
      output: false
      """

      def validateIP(ip):
      #split them by '.' , and store them in an array
      #check the array if the length is 4 length
      arr = ip.split('.')
      if len(arr) != 4:
      return False
      #0 check for special edge cases when non-digit
      #1. check if they are digit,
      #2. check if check the integer is between 0 and 255

      for part in arr:
      if len(part) > 1:
      if part[0] == '0':
      return False
      if not part.isdigit():
      return False
      digit = int(part)
      if digit < 0 or digit > 255:
      return False
      return True

      #case#0

      ip0="08.0.0.0" # False
      test0= validateIP(ip0)
      print(test0)

      #case#1
      ip1 = "192.168.0.1"
      test1 = validateIP(ip1)
      print(test1)

      #case#2
      ip2 = '0.0.0.0'
      test2 = validateIP(ip2)
      print(test2)

      #case#3
      ip3 = '123.24.59.99'
      test3 = validateIP(ip3)
      print(test3)

      #case#4
      ip4 = '192.168.123.456'
      test4 = validateIP(ip4)
      print(test4)

      #case5
      ip5 = "255.255.255.255"
      test5 = validateIP(ip5)
      print(test5)









      share|improve this question











      $endgroup$




      Validate IP Address



      I got this problem during an interview. And would like to get some code review. I also wrote several tests with the expected output, and they all passed as expected.




      Validate an IP address (IPv4). An address is valid if and only if it
      is in the form "X.X.X.X", where each X is a number from 0 to 255.



      For example, "12.34.5.6", "0.23.25.0", and "255.255.255.255" are valid
      IP addresses, while "12.34.56.oops", "1.2.3.4.5", and
      "123.235.153.425" are invalid IP addresses.




      Examples:

      """

      ip = '192.168.0.1'
      output: true

      ip = '0.0.0.0'
      output: true

      ip = '123.24.59.99'
      output: true

      ip = '192.168.123.456'
      output: false
      """

      def validateIP(ip):
      #split them by '.' , and store them in an array
      #check the array if the length is 4 length
      arr = ip.split('.')
      if len(arr) != 4:
      return False
      #0 check for special edge cases when non-digit
      #1. check if they are digit,
      #2. check if check the integer is between 0 and 255

      for part in arr:
      if len(part) > 1:
      if part[0] == '0':
      return False
      if not part.isdigit():
      return False
      digit = int(part)
      if digit < 0 or digit > 255:
      return False
      return True

      #case#0

      ip0="08.0.0.0" # False
      test0= validateIP(ip0)
      print(test0)

      #case#1
      ip1 = "192.168.0.1"
      test1 = validateIP(ip1)
      print(test1)

      #case#2
      ip2 = '0.0.0.0'
      test2 = validateIP(ip2)
      print(test2)

      #case#3
      ip3 = '123.24.59.99'
      test3 = validateIP(ip3)
      print(test3)

      #case#4
      ip4 = '192.168.123.456'
      test4 = validateIP(ip4)
      print(test4)

      #case5
      ip5 = "255.255.255.255"
      test5 = validateIP(ip5)
      print(test5)






      python interview-questions validation ip-address






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Mar 27 at 12:04









      200_success

      131k17156420




      131k17156420










      asked Mar 27 at 4:57









      NinjaGNinjaG

      893633




      893633






















          2 Answers
          2






          active

          oldest

          votes


















          10












          $begingroup$


          def validateIP(ip):



          I would expect a name starting is (a useful hint that it returns a Boolean rather than some more complex validation data structure) and explicitly mentioning IP v4 (since the current name is misleading). E.g. is_valid_IPv4_address.






            #split them by '.' , and store them in an array
          #check the array if the length is 4 length
          arr = ip.split('.')
          if len(arr) != 4:
          return False



          The comments don't tell me anything which the code doesn't already. In general, good comments explain why, not what.






            #0 check for special edge cases when non-digit
          #1. check if they are digit,
          #2. check if check the integer is between 0 and 255

          for part in arr:
          .. various conditions which return False
          return True



          IMO it would be more Pythonic to use all: I would boil the whole function down to



              parts = ip.split('.')
          return len(parts) == 4 and all(is_valid_IPv4_address_part(part) for part in parts)





              if len(part) > 1:
          if part[0] == '0':
          return False



          This isn't in the spec. It's a reasonable constraint, but you should check with the person who gave you the spec before writing the code, or at least put in a comment saying that you're making an assumption about the true intentions of the specifier.






              if not part.isdigit():
          return False



          This is buggy. (Before testing I thought there was an issue which should be bounced back to the specifier. Upon testing, I found that some of my test cases caused validateIP to throw an exception).



          What is the expected output for these test cases?



          ¹.¹.¹.¹
          ١.١.١.١
          𝟣.𝟣.𝟣.𝟣
          ①.①.①.①





          share|improve this answer









          $endgroup$





















            8












            $begingroup$



            1. A doc string reads nicer then # blockcomments



              Consider making a doc string of that function, so you can do help(validate_ip) and it will print the doc string in the interpreter.




            2. Adhere to PEP8



              Functions and variables should be snake_case ie def validate_ip(ip):



            3. You could use the all keyword to check if each part is correct; this will return False for the first failure.



            4. Make actual tests that ensure validity



              Instead of printing tests, make actual tests either with assert or the modules doctest or unittest.




            5. There is a module that does this for you



              Python is often described as "batteries included", and here you could use the ipaddress module, which will validate an IP when you create the IPv4Adress object.




            Reworked code



            import doctest

            def validate_ip(ip):
            """
            Checks if the ip address is valid
            args:
            ip (str): The IP address
            ret:
            A boolean: True for a a valid IP

            >>> validate_ip('08.0.0.0')
            False

            >>> validate_ip('192.169.0.1')
            True

            >>> validate_ip('0.0.0.0')
            True

            >>> validate_ip('192.168.123.456')
            False

            >>> validate_ip('oooh.0.0.1')
            False
            """
            ranges = ip.split('.')
            return len(ranges) == 4
            and all(
            r.isdigit() and # Check for digits
            int(r) in range(0, 256) and # Check in range of 0-255
            (r[0] != "0" or len(r) == 1) # Check for leading zero's
            for r in ranges
            )

            if __name__ == '__main__':
            doctest.testmod()


            ipaddress module



            from ipaddress import IPv4Address

            def is_valid_ip(ip):
            try:
            IPv4Address(ip)
            return True
            except ValueError:
            return False





            share|improve this answer











            $endgroup$














              Your Answer





              StackExchange.ifUsing("editor", function () {
              return StackExchange.using("mathjaxEditing", function () {
              StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
              StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
              });
              });
              }, "mathjax-editing");

              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: "196"
              };
              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: false,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: null,
              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%2fcodereview.stackexchange.com%2fquestions%2f216311%2fvalidate-ip4-address%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









              10












              $begingroup$


              def validateIP(ip):



              I would expect a name starting is (a useful hint that it returns a Boolean rather than some more complex validation data structure) and explicitly mentioning IP v4 (since the current name is misleading). E.g. is_valid_IPv4_address.






                #split them by '.' , and store them in an array
              #check the array if the length is 4 length
              arr = ip.split('.')
              if len(arr) != 4:
              return False



              The comments don't tell me anything which the code doesn't already. In general, good comments explain why, not what.






                #0 check for special edge cases when non-digit
              #1. check if they are digit,
              #2. check if check the integer is between 0 and 255

              for part in arr:
              .. various conditions which return False
              return True



              IMO it would be more Pythonic to use all: I would boil the whole function down to



                  parts = ip.split('.')
              return len(parts) == 4 and all(is_valid_IPv4_address_part(part) for part in parts)





                  if len(part) > 1:
              if part[0] == '0':
              return False



              This isn't in the spec. It's a reasonable constraint, but you should check with the person who gave you the spec before writing the code, or at least put in a comment saying that you're making an assumption about the true intentions of the specifier.






                  if not part.isdigit():
              return False



              This is buggy. (Before testing I thought there was an issue which should be bounced back to the specifier. Upon testing, I found that some of my test cases caused validateIP to throw an exception).



              What is the expected output for these test cases?



              ¹.¹.¹.¹
              ١.١.١.١
              𝟣.𝟣.𝟣.𝟣
              ①.①.①.①





              share|improve this answer









              $endgroup$


















                10












                $begingroup$


                def validateIP(ip):



                I would expect a name starting is (a useful hint that it returns a Boolean rather than some more complex validation data structure) and explicitly mentioning IP v4 (since the current name is misleading). E.g. is_valid_IPv4_address.






                  #split them by '.' , and store them in an array
                #check the array if the length is 4 length
                arr = ip.split('.')
                if len(arr) != 4:
                return False



                The comments don't tell me anything which the code doesn't already. In general, good comments explain why, not what.






                  #0 check for special edge cases when non-digit
                #1. check if they are digit,
                #2. check if check the integer is between 0 and 255

                for part in arr:
                .. various conditions which return False
                return True



                IMO it would be more Pythonic to use all: I would boil the whole function down to



                    parts = ip.split('.')
                return len(parts) == 4 and all(is_valid_IPv4_address_part(part) for part in parts)





                    if len(part) > 1:
                if part[0] == '0':
                return False



                This isn't in the spec. It's a reasonable constraint, but you should check with the person who gave you the spec before writing the code, or at least put in a comment saying that you're making an assumption about the true intentions of the specifier.






                    if not part.isdigit():
                return False



                This is buggy. (Before testing I thought there was an issue which should be bounced back to the specifier. Upon testing, I found that some of my test cases caused validateIP to throw an exception).



                What is the expected output for these test cases?



                ¹.¹.¹.¹
                ١.١.١.١
                𝟣.𝟣.𝟣.𝟣
                ①.①.①.①





                share|improve this answer









                $endgroup$
















                  10












                  10








                  10





                  $begingroup$


                  def validateIP(ip):



                  I would expect a name starting is (a useful hint that it returns a Boolean rather than some more complex validation data structure) and explicitly mentioning IP v4 (since the current name is misleading). E.g. is_valid_IPv4_address.






                    #split them by '.' , and store them in an array
                  #check the array if the length is 4 length
                  arr = ip.split('.')
                  if len(arr) != 4:
                  return False



                  The comments don't tell me anything which the code doesn't already. In general, good comments explain why, not what.






                    #0 check for special edge cases when non-digit
                  #1. check if they are digit,
                  #2. check if check the integer is between 0 and 255

                  for part in arr:
                  .. various conditions which return False
                  return True



                  IMO it would be more Pythonic to use all: I would boil the whole function down to



                      parts = ip.split('.')
                  return len(parts) == 4 and all(is_valid_IPv4_address_part(part) for part in parts)





                      if len(part) > 1:
                  if part[0] == '0':
                  return False



                  This isn't in the spec. It's a reasonable constraint, but you should check with the person who gave you the spec before writing the code, or at least put in a comment saying that you're making an assumption about the true intentions of the specifier.






                      if not part.isdigit():
                  return False



                  This is buggy. (Before testing I thought there was an issue which should be bounced back to the specifier. Upon testing, I found that some of my test cases caused validateIP to throw an exception).



                  What is the expected output for these test cases?



                  ¹.¹.¹.¹
                  ١.١.١.١
                  𝟣.𝟣.𝟣.𝟣
                  ①.①.①.①





                  share|improve this answer









                  $endgroup$




                  def validateIP(ip):



                  I would expect a name starting is (a useful hint that it returns a Boolean rather than some more complex validation data structure) and explicitly mentioning IP v4 (since the current name is misleading). E.g. is_valid_IPv4_address.






                    #split them by '.' , and store them in an array
                  #check the array if the length is 4 length
                  arr = ip.split('.')
                  if len(arr) != 4:
                  return False



                  The comments don't tell me anything which the code doesn't already. In general, good comments explain why, not what.






                    #0 check for special edge cases when non-digit
                  #1. check if they are digit,
                  #2. check if check the integer is between 0 and 255

                  for part in arr:
                  .. various conditions which return False
                  return True



                  IMO it would be more Pythonic to use all: I would boil the whole function down to



                      parts = ip.split('.')
                  return len(parts) == 4 and all(is_valid_IPv4_address_part(part) for part in parts)





                      if len(part) > 1:
                  if part[0] == '0':
                  return False



                  This isn't in the spec. It's a reasonable constraint, but you should check with the person who gave you the spec before writing the code, or at least put in a comment saying that you're making an assumption about the true intentions of the specifier.






                      if not part.isdigit():
                  return False



                  This is buggy. (Before testing I thought there was an issue which should be bounced back to the specifier. Upon testing, I found that some of my test cases caused validateIP to throw an exception).



                  What is the expected output for these test cases?



                  ¹.¹.¹.¹
                  ١.١.١.١
                  𝟣.𝟣.𝟣.𝟣
                  ①.①.①.①






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Mar 27 at 8:53









                  Peter TaylorPeter Taylor

                  18.2k2964




                  18.2k2964

























                      8












                      $begingroup$



                      1. A doc string reads nicer then # blockcomments



                        Consider making a doc string of that function, so you can do help(validate_ip) and it will print the doc string in the interpreter.




                      2. Adhere to PEP8



                        Functions and variables should be snake_case ie def validate_ip(ip):



                      3. You could use the all keyword to check if each part is correct; this will return False for the first failure.



                      4. Make actual tests that ensure validity



                        Instead of printing tests, make actual tests either with assert or the modules doctest or unittest.




                      5. There is a module that does this for you



                        Python is often described as "batteries included", and here you could use the ipaddress module, which will validate an IP when you create the IPv4Adress object.




                      Reworked code



                      import doctest

                      def validate_ip(ip):
                      """
                      Checks if the ip address is valid
                      args:
                      ip (str): The IP address
                      ret:
                      A boolean: True for a a valid IP

                      >>> validate_ip('08.0.0.0')
                      False

                      >>> validate_ip('192.169.0.1')
                      True

                      >>> validate_ip('0.0.0.0')
                      True

                      >>> validate_ip('192.168.123.456')
                      False

                      >>> validate_ip('oooh.0.0.1')
                      False
                      """
                      ranges = ip.split('.')
                      return len(ranges) == 4
                      and all(
                      r.isdigit() and # Check for digits
                      int(r) in range(0, 256) and # Check in range of 0-255
                      (r[0] != "0" or len(r) == 1) # Check for leading zero's
                      for r in ranges
                      )

                      if __name__ == '__main__':
                      doctest.testmod()


                      ipaddress module



                      from ipaddress import IPv4Address

                      def is_valid_ip(ip):
                      try:
                      IPv4Address(ip)
                      return True
                      except ValueError:
                      return False





                      share|improve this answer











                      $endgroup$


















                        8












                        $begingroup$



                        1. A doc string reads nicer then # blockcomments



                          Consider making a doc string of that function, so you can do help(validate_ip) and it will print the doc string in the interpreter.




                        2. Adhere to PEP8



                          Functions and variables should be snake_case ie def validate_ip(ip):



                        3. You could use the all keyword to check if each part is correct; this will return False for the first failure.



                        4. Make actual tests that ensure validity



                          Instead of printing tests, make actual tests either with assert or the modules doctest or unittest.




                        5. There is a module that does this for you



                          Python is often described as "batteries included", and here you could use the ipaddress module, which will validate an IP when you create the IPv4Adress object.




                        Reworked code



                        import doctest

                        def validate_ip(ip):
                        """
                        Checks if the ip address is valid
                        args:
                        ip (str): The IP address
                        ret:
                        A boolean: True for a a valid IP

                        >>> validate_ip('08.0.0.0')
                        False

                        >>> validate_ip('192.169.0.1')
                        True

                        >>> validate_ip('0.0.0.0')
                        True

                        >>> validate_ip('192.168.123.456')
                        False

                        >>> validate_ip('oooh.0.0.1')
                        False
                        """
                        ranges = ip.split('.')
                        return len(ranges) == 4
                        and all(
                        r.isdigit() and # Check for digits
                        int(r) in range(0, 256) and # Check in range of 0-255
                        (r[0] != "0" or len(r) == 1) # Check for leading zero's
                        for r in ranges
                        )

                        if __name__ == '__main__':
                        doctest.testmod()


                        ipaddress module



                        from ipaddress import IPv4Address

                        def is_valid_ip(ip):
                        try:
                        IPv4Address(ip)
                        return True
                        except ValueError:
                        return False





                        share|improve this answer











                        $endgroup$
















                          8












                          8








                          8





                          $begingroup$



                          1. A doc string reads nicer then # blockcomments



                            Consider making a doc string of that function, so you can do help(validate_ip) and it will print the doc string in the interpreter.




                          2. Adhere to PEP8



                            Functions and variables should be snake_case ie def validate_ip(ip):



                          3. You could use the all keyword to check if each part is correct; this will return False for the first failure.



                          4. Make actual tests that ensure validity



                            Instead of printing tests, make actual tests either with assert or the modules doctest or unittest.




                          5. There is a module that does this for you



                            Python is often described as "batteries included", and here you could use the ipaddress module, which will validate an IP when you create the IPv4Adress object.




                          Reworked code



                          import doctest

                          def validate_ip(ip):
                          """
                          Checks if the ip address is valid
                          args:
                          ip (str): The IP address
                          ret:
                          A boolean: True for a a valid IP

                          >>> validate_ip('08.0.0.0')
                          False

                          >>> validate_ip('192.169.0.1')
                          True

                          >>> validate_ip('0.0.0.0')
                          True

                          >>> validate_ip('192.168.123.456')
                          False

                          >>> validate_ip('oooh.0.0.1')
                          False
                          """
                          ranges = ip.split('.')
                          return len(ranges) == 4
                          and all(
                          r.isdigit() and # Check for digits
                          int(r) in range(0, 256) and # Check in range of 0-255
                          (r[0] != "0" or len(r) == 1) # Check for leading zero's
                          for r in ranges
                          )

                          if __name__ == '__main__':
                          doctest.testmod()


                          ipaddress module



                          from ipaddress import IPv4Address

                          def is_valid_ip(ip):
                          try:
                          IPv4Address(ip)
                          return True
                          except ValueError:
                          return False





                          share|improve this answer











                          $endgroup$





                          1. A doc string reads nicer then # blockcomments



                            Consider making a doc string of that function, so you can do help(validate_ip) and it will print the doc string in the interpreter.




                          2. Adhere to PEP8



                            Functions and variables should be snake_case ie def validate_ip(ip):



                          3. You could use the all keyword to check if each part is correct; this will return False for the first failure.



                          4. Make actual tests that ensure validity



                            Instead of printing tests, make actual tests either with assert or the modules doctest or unittest.




                          5. There is a module that does this for you



                            Python is often described as "batteries included", and here you could use the ipaddress module, which will validate an IP when you create the IPv4Adress object.




                          Reworked code



                          import doctest

                          def validate_ip(ip):
                          """
                          Checks if the ip address is valid
                          args:
                          ip (str): The IP address
                          ret:
                          A boolean: True for a a valid IP

                          >>> validate_ip('08.0.0.0')
                          False

                          >>> validate_ip('192.169.0.1')
                          True

                          >>> validate_ip('0.0.0.0')
                          True

                          >>> validate_ip('192.168.123.456')
                          False

                          >>> validate_ip('oooh.0.0.1')
                          False
                          """
                          ranges = ip.split('.')
                          return len(ranges) == 4
                          and all(
                          r.isdigit() and # Check for digits
                          int(r) in range(0, 256) and # Check in range of 0-255
                          (r[0] != "0" or len(r) == 1) # Check for leading zero's
                          for r in ranges
                          )

                          if __name__ == '__main__':
                          doctest.testmod()


                          ipaddress module



                          from ipaddress import IPv4Address

                          def is_valid_ip(ip):
                          try:
                          IPv4Address(ip)
                          return True
                          except ValueError:
                          return False






                          share|improve this answer














                          share|improve this answer



                          share|improve this answer








                          edited Mar 27 at 8:30









                          Toby Speight

                          26.9k742118




                          26.9k742118










                          answered Mar 27 at 8:04









                          LudisposedLudisposed

                          9,11322267




                          9,11322267






























                              draft saved

                              draft discarded




















































                              Thanks for contributing an answer to Code Review Stack Exchange!


                              • 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.


                              Use MathJax to format equations. MathJax reference.


                              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%2fcodereview.stackexchange.com%2fquestions%2f216311%2fvalidate-ip4-address%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

                              Plaza Victoria

                              In PowerPoint, is there a keyboard shortcut for bulleted / numbered list?

                              How to put 3 figures in Latex with 2 figures side by side and 1 below these side by side images but in...