[Tutor] Created Function, Need Argument to be a String

Sibylle Koczian nulla.epistola at web.de
Fri Dec 16 13:49:25 EST 2016

Am 12.12.2016 um 17:29 schrieb Bryon Adams:
> Is there a way to force my argument to always be a string before
> entering the function? Else, is there a better way to go about this? In
> whatever program I write, I could change what I want as input to be a
> string prior to tossing it into the function but I think it would make
> more sense for my function to already do it. The function otherwise
> works. This is on Python3.5 under Fedora 25
> The only other thing I could think of would be to put exceptions in for
> syntax error and whatever else pops up as I go along, though to be
> honest it *should* always be a string that gets dumped into the
> function. Not sure how I'd put the exception together though since it's
> not making it into the function prior to failing.

Syntax errors don't raise exceptions, because the program doesn't start 
at all as long as it contains them. Exceptions are raised at runtime.

> -------------------------------------------
> Error from interpreter: (looks like it's taking issue with it being a
> number it doesn't know how to deal with)
>>>> ip_checker(
>   File "<stdin>", line 1
>     ip_checker(
>                        ^
> SyntaxError: invalid syntax
You are calling the function with an invalid literal: a number can't 
contain more than one decimal point and a string literal needs quotes 
around it.

If the argument is valid but is no string (a number, a list or anything 
else) trying to split it raises an AttributeError:

 >>> s = 123.456
 >>> s.split('.')
Traceback (most recent call last):
   File "<pyshell#1>", line 1, in <module>
AttributeError: 'float' object has no attribute 'split'
 >>> ['a', 'b', 'c'].split('.')
Traceback (most recent call last):
   File "<pyshell#2>", line 1, in <module>
     ['a', 'b', 'c'].split('.')
AttributeError: 'list' object has no attribute 'split'

So you could use a second except clause:

     ip_addr = ...
except ValueError:
except AttributeError:
     print("Argument must be a string, please try again.")
     return False

> -------------------------------------------
> My function:
> def ip_checker(ip_address):
>   '''
>   Takes one IP address and checks whether it is valid or not.
>   '''
>   # Try to convert to integers
>   try:
>     ip_addr = [int(i) for i in ip_address.split('.')]
>   except ValueError:
>     print('Invalid characters were entered or an octet is empty, please
> try again.')
>     return False


More information about the Tutor mailing list