[Python-Dev] Approaches to argument type-checking
Tennessee Leeuwenburg
tleeuwenburg at gmail.com
Thu Mar 12 04:23:50 CET 2009
Hi all,
I am currently looking at issue 5236. This issue regards the exception
raised when a bytes string is passed into time.strptime. In addition to the
specific question I have regarding this issue, I wasn't sure if this was
something for python-dev or for the issue comment. However, it does concern
general Python coding approach, so just give me a pointer over whether this
is better kept on the tracker or whether posting to the list was a good idea
(I'm slowly learning!)
EXAMPLE OF PROBLEM:
>>> time.strptime(b'2009', "%Y")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/tjl/python3/lib/python3.1/_strptime.py", line 454, in
_strptime_time
return _strptime(data_string, format)[0]
File "/home/tjl/python3/lib/python3.1/_strptime.py", line 322, in
_strptime
found = format_regex.match(data_string)
TypeError: can't use a string pattern on a bytes-like object
WHEREAS:
>>> time.strftime(b"%Y")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: strftime() argument 1 must be str, not bytes
What is occurring here is that the arguments to strftime are being
type-checked up-front, whereas in strptime they are not. Further, srtptime
is implemented in a python file, _strptime.py, whiel strftime is implemented
in timemodule.c.
It appears as though it is generally the case (or at least often the case)
that C functions are making use of the vgetargs function which performs a
goodly bit of type checking. However, the same does not seem to hold for the
Python interface functions.
>From the Python interpreter perspective, though, both are in the time module
(time.strftime and time.strptime) so the inconsistency is a bit jarring. I
can see that I could solve this a few ways:
* Do a false-parse of the arguments using the same vgetargs1 method, but
not do anything with the return value
* Perform a type-check on the relevant argument, data_string, in Python
and raise a more specific Exception
* Write some kind of generic type-checking helper method which could be
re-used
Is there a general strategy used in Python development which I should be
aware of? i.e. is it customary to type-check every argument of an interface
method? Or is it customary not to perform type checking up-front and simply
allow the exception to occur deeper in the code? Are there performance
issues surrounding defensive programming?
Regards,
-Tennessee
--
--------------------------------------------------
Tennessee Leeuwenburg
http://myownhat.blogspot.com/
"Don't believe everything you think"
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20090312/a8069c7b/attachment.htm>
More information about the Python-Dev
mailing list