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;
$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)
python interview-questions validation ip-address
$endgroup$
add a comment |
$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)
python interview-questions validation ip-address
$endgroup$
add a comment |
$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)
python interview-questions validation ip-address
$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
python interview-questions validation ip-address
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
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
$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?
¹.¹.¹.¹
١.١.١.١
𝟣.𝟣.𝟣.𝟣
①.①.①.①
$endgroup$
$begingroup$
Ah, I see. Good to know, I always thoughtstr.isdigit
would only return true for1234567890
. Need to fix an answer I just wrote on another question...
$endgroup$
– Graipher
Apr 2 at 14:30
add a comment |
$begingroup$
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.Adhere to PEP8
Functions and variables should be
snake_case
iedef validate_ip(ip):
You could use the
all
keyword to check if each part is correct; this will returnFalse
for the first failure.Make actual tests that ensure validity
Instead of printing tests, make actual tests either with
assert
or the modulesdoctest
orunittest
.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 theIPv4Adress
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
$endgroup$
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
$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?
¹.¹.¹.¹
١.١.١.١
𝟣.𝟣.𝟣.𝟣
①.①.①.①
$endgroup$
$begingroup$
Ah, I see. Good to know, I always thoughtstr.isdigit
would only return true for1234567890
. Need to fix an answer I just wrote on another question...
$endgroup$
– Graipher
Apr 2 at 14:30
add a comment |
$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?
¹.¹.¹.¹
١.١.١.١
𝟣.𝟣.𝟣.𝟣
①.①.①.①
$endgroup$
$begingroup$
Ah, I see. Good to know, I always thoughtstr.isdigit
would only return true for1234567890
. Need to fix an answer I just wrote on another question...
$endgroup$
– Graipher
Apr 2 at 14:30
add a comment |
$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?
¹.¹.¹.¹
١.١.١.١
𝟣.𝟣.𝟣.𝟣
①.①.①.①
$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?
¹.¹.¹.¹
١.١.١.١
𝟣.𝟣.𝟣.𝟣
①.①.①.①
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 thoughtstr.isdigit
would only return true for1234567890
. Need to fix an answer I just wrote on another question...
$endgroup$
– Graipher
Apr 2 at 14:30
add a comment |
$begingroup$
Ah, I see. Good to know, I always thoughtstr.isdigit
would only return true for1234567890
. 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
add a comment |
$begingroup$
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.Adhere to PEP8
Functions and variables should be
snake_case
iedef validate_ip(ip):
You could use the
all
keyword to check if each part is correct; this will returnFalse
for the first failure.Make actual tests that ensure validity
Instead of printing tests, make actual tests either with
assert
or the modulesdoctest
orunittest
.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 theIPv4Adress
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
$endgroup$
add a comment |
$begingroup$
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.Adhere to PEP8
Functions and variables should be
snake_case
iedef validate_ip(ip):
You could use the
all
keyword to check if each part is correct; this will returnFalse
for the first failure.Make actual tests that ensure validity
Instead of printing tests, make actual tests either with
assert
or the modulesdoctest
orunittest
.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 theIPv4Adress
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
$endgroup$
add a comment |
$begingroup$
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.Adhere to PEP8
Functions and variables should be
snake_case
iedef validate_ip(ip):
You could use the
all
keyword to check if each part is correct; this will returnFalse
for the first failure.Make actual tests that ensure validity
Instead of printing tests, make actual tests either with
assert
or the modulesdoctest
orunittest
.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 theIPv4Adress
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
$endgroup$
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.Adhere to PEP8
Functions and variables should be
snake_case
iedef validate_ip(ip):
You could use the
all
keyword to check if each part is correct; this will returnFalse
for the first failure.Make actual tests that ensure validity
Instead of printing tests, make actual tests either with
assert
or the modulesdoctest
orunittest
.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 theIPv4Adress
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
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
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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