Validate IP4 addressValidate IP address in JavaTweets per secondTypeahead Talent BuddyISBN missing number solverCount the accumulated rainfall in a 2D mountain rangePython IBAN validationWAKE UP! CodingBat alarm clockValidating an IP address and returning the reason it's invalidHackerrank Gemstones SolutionCounting lower vs non-lowercase tokens for tokenized text with several conditions

Did Pope Urban II issue the papal bull "terra nullius" in 1095?

How can God warn people of the upcoming rapture without disrupting society?

Why won't the Republicans use a superdelegate system like the DNC in their nomination process?

Would the USA be eligible to join the European Union?

What is the most difficult concept to grasp in Calculus 1?

Why does cat'ing a file via ssh result in control characters?

How much can I judge a company based on a phone screening?

How can I communicate my issues with a potential date's pushy behavior?

Why aren't rockets built with truss structures inside their fuel & oxidizer tanks to increase structural strength?

How do some PhD students get 10+ papers? Is that what I need for landing good faculty position?

Why is there a large performance impact when looping over an array over 240 elements?

What would it take to get a message to another star?

Would Mirko Vosk, Mind Drinker trigger Waste Not?

Is there a way to proportionalize fixed costs in a MILP?

Lípínguapua dopo Pêpê

How would you translate this? バタコチーズライス

How should I write this passage to make it the most readable?

What can Amex do if I cancel their card after using the sign up bonus miles?

What unique challenges/limitations will I face if I start a career as a pilot at 45 years old?

Are there any cons in using rounded corners for bar graphs?

Does fossil fuels use since 1990 account for half of all the fossil fuels used in history?

Dogfights in outer space

NRPE script for monitoring load average

Global BGP Routing only by only importing supernet prefixes



Validate IP4 address


Validate IP address in JavaTweets per secondTypeahead Talent BuddyISBN missing number solverCount the accumulated rainfall in a 2D mountain rangePython IBAN validationWAKE UP! CodingBat alarm clockValidating an IP address and returning the reason it's invalidHackerrank Gemstones SolutionCounting lower vs non-lowercase tokens for tokenized text with several conditions






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








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

      135k21 gold badges173 silver badges443 bronze badges




      135k21 gold badges173 silver badges443 bronze badges










      asked Mar 27 at 4:57









      NinjaGNinjaG

      9151 gold badge9 silver badges36 bronze badges




      9151 gold badge9 silver badges36 bronze badges























          2 Answers
          2






          active

          oldest

          votes


















          11












          $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$














          • $begingroup$
            Ah, I see. Good to know, I always thought str.isdigit would only return true for 1234567890. Need to fix an answer I just wrote on another question...
            $endgroup$
            – Graipher
            Apr 2 at 14:30



















          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 ()
            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









            11












            $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$














            • $begingroup$
              Ah, I see. Good to know, I always thought str.isdigit would only return true for 1234567890. Need to fix an answer I just wrote on another question...
              $endgroup$
              – Graipher
              Apr 2 at 14:30
















            11












            $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$














            • $begingroup$
              Ah, I see. Good to know, I always thought str.isdigit would only return true for 1234567890. Need to fix an answer I just wrote on another question...
              $endgroup$
              – Graipher
              Apr 2 at 14:30














            11












            11








            11





            $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

            21.4k36 silver badges78 bronze badges




            21.4k36 silver badges78 bronze badges














            • $begingroup$
              Ah, I see. Good to know, I always thought str.isdigit would only return true for 1234567890. Need to fix an answer I just wrote on another question...
              $endgroup$
              – Graipher
              Apr 2 at 14:30

















            • $begingroup$
              Ah, I see. Good to know, I always thought str.isdigit would only return true for 1234567890. Need to fix an answer I just wrote on another question...
              $endgroup$
              – Graipher
              Apr 2 at 14:30
















            $begingroup$
            Ah, I see. Good to know, I always thought str.isdigit would only return true for 1234567890. Need to fix an answer I just wrote on another question...
            $endgroup$
            – Graipher
            Apr 2 at 14:30





            $begingroup$
            Ah, I see. Good to know, I always thought str.isdigit would only return true for 1234567890. Need to fix an answer I just wrote on another question...
            $endgroup$
            – Graipher
            Apr 2 at 14:30














            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

                31.1k7 gold badges45 silver badges135 bronze badges




                31.1k7 gold badges45 silver badges135 bronze badges










                answered Mar 27 at 8:04









                LudisposedLudisposed

                9,3232 gold badges26 silver badges70 bronze badges




                9,3232 gold badges26 silver badges70 bronze badges






























                    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

                    Kamusi Yaliyomo Aina za kamusi | Muundo wa kamusi | Faida za kamusi | Dhima ya picha katika kamusi | Marejeo | Tazama pia | Viungo vya nje | UrambazajiKuhusu kamusiGo-SwahiliWiki-KamusiKamusi ya Kiswahili na Kiingerezakuihariri na kuongeza habari

                    Swift 4 - func physicsWorld not invoked on collision? The Next CEO of Stack OverflowHow to call Objective-C code from Swift#ifdef replacement in the Swift language@selector() in Swift?#pragma mark in Swift?Swift for loop: for index, element in array?dispatch_after - GCD in Swift?Swift Beta performance: sorting arraysSplit a String into an array in Swift?The use of Swift 3 @objc inference in Swift 4 mode is deprecated?How to optimize UITableViewCell, because my UITableView lags

                    Access current req object everywhere in Node.js ExpressWhy are global variables considered bad practice? (node.js)Using req & res across functionsHow do I get the path to the current script with Node.js?What is Node.js' Connect, Express and “middleware”?Node.js w/ express error handling in callbackHow to access the GET parameters after “?” in Express?Modify Node.js req object parametersAccess “app” variable inside of ExpressJS/ConnectJS middleware?Node.js Express app - request objectAngular Http Module considered middleware?Session variables in ExpressJSAdd properties to the req object in expressjs with Typescript