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
Customer Requests (Sometimes) Drive Me Bonkers!
Increase performance creating Mandelbrot set in python
How to write papers efficiently when English isn't my first language?
Did Dumbledore lie to Harry about how long he had James Potter's invisibility cloak when he was examining it? If so, why?
India just shot down a satellite from the ground. At what altitude range is the resulting debris field?
How did Doctor Strange see the winning outcome in Avengers: Infinity War?
Hostile work environment after whistle-blowing on coworker and our boss. What do I do?
What is the best translation for "slot" in the context of multiplayer video games?
How to safely derail a train during transit?
Applicability of Single Responsibility Principle
Italian words for tools
What does "I’d sit this one out, Cap," imply or mean in the context?
Why Were Madagascar and New Zealand Discovered So Late?
Sort a list by elements of another list
Is `x >> pure y` equivalent to `liftM (const y) x`
What's the purpose of "true" in bash "if sudo true; then"
Is there any reason not to eat food that's been dropped on the surface of the moon?
How can I get through very long and very dry, but also very useful technical documents when learning a new tool?
How many times can American Tourist re-enter UK in same 6 month period?
How can we prove that any integral in the set of non-elementary integrals cannot be expressed in the form of elementary functions?
Does "every" first-order theory have a finitely axiomatizable conservative extension?
How does Loki do this?
Are student evaluations of teaching assistants read by others in the faculty?
How does the UK government determine the size of a mandate?
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
$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 9 hours ago
200_success
130k17155419
130k17155419
asked 16 hours ago
NinjaGNinjaG
893633
893633
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$
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$
$begingroup$
As a bonus, docstrings are picked up by Python's built-in help mechanisms.
$endgroup$
– Alex
13 hours ago
$begingroup$
@Alex I did mention help
$endgroup$
– Ludisposed
13 hours ago
$begingroup$
Sorry, must have skipped over this.
$endgroup$
– Alex
13 hours ago
add a comment |
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
);
);
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$
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$
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 12 hours ago
Peter TaylorPeter Taylor
18.2k2963
18.2k2963
add a comment |
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$
$begingroup$
As a bonus, docstrings are picked up by Python's built-in help mechanisms.
$endgroup$
– Alex
13 hours ago
$begingroup$
@Alex I did mention help
$endgroup$
– Ludisposed
13 hours ago
$begingroup$
Sorry, must have skipped over this.
$endgroup$
– Alex
13 hours ago
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$
$begingroup$
As a bonus, docstrings are picked up by Python's built-in help mechanisms.
$endgroup$
– Alex
13 hours ago
$begingroup$
@Alex I did mention help
$endgroup$
– Ludisposed
13 hours ago
$begingroup$
Sorry, must have skipped over this.
$endgroup$
– Alex
13 hours ago
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 13 hours ago
Toby Speight
26.7k742118
26.7k742118
answered 13 hours ago
LudisposedLudisposed
9,06822267
9,06822267
$begingroup$
As a bonus, docstrings are picked up by Python's built-in help mechanisms.
$endgroup$
– Alex
13 hours ago
$begingroup$
@Alex I did mention help
$endgroup$
– Ludisposed
13 hours ago
$begingroup$
Sorry, must have skipped over this.
$endgroup$
– Alex
13 hours ago
add a comment |
$begingroup$
As a bonus, docstrings are picked up by Python's built-in help mechanisms.
$endgroup$
– Alex
13 hours ago
$begingroup$
@Alex I did mention help
$endgroup$
– Ludisposed
13 hours ago
$begingroup$
Sorry, must have skipped over this.
$endgroup$
– Alex
13 hours ago
$begingroup$
As a bonus, docstrings are picked up by Python's built-in help mechanisms.
$endgroup$
– Alex
13 hours ago
$begingroup$
As a bonus, docstrings are picked up by Python's built-in help mechanisms.
$endgroup$
– Alex
13 hours ago
$begingroup$
@Alex I did mention help
$endgroup$
– Ludisposed
13 hours ago
$begingroup$
@Alex I did mention help
$endgroup$
– Ludisposed
13 hours ago
$begingroup$
Sorry, must have skipped over this.
$endgroup$
– Alex
13 hours ago
$begingroup$
Sorry, must have skipped over this.
$endgroup$
– Alex
13 hours ago
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