does lack of type declarations make Python unsafe?
Bengt Richter
bokr at oz.net
Mon Jun 16 16:12:17 EDT 2003
On Mon, 16 Jun 2003 08:54:23 GMT, Alex Martelli <aleax at aleax.it> wrote:
><posted & mailed>
>
>martin z wrote:
>
>>> You *can* test the types of the arguments yourself, inside
>>> the function. But this is regarded bad practice amongst Python
>>> programmers, for the above mentioned reasons.
>>
>> On this subject, is there a way to test not the specific type, or simply
>> the
>> protocol an object supports? String, int, etc. I want to make a function
>> do one thing with a numeric-type object and a different thing with a
>> string-type object.
>
>It depends, of course, on what you want "numeric-type" and "string-type"
>to mean. For my purposes, I've found the following very simple "protocol
>testing" functions work just fine:
>
>def isStringLike(s):
> try: s+''
Nit: succeeding with this test could be expensive if s is e.g., a 100MB file image
(I think this has come up before in a discussion of such testing, but I forgot if
it was me ;-)
> except: return False
> else: return True
>
>def isNumberLike(s):
> try: s+0
> except: return False
> else: return True
I like the concept of testing for comptible behavior, but I would want to
feel sure that there could be no unexpected side effects from testing any
candidate args.
I know you understand all these issues, but all readers of this might not
without a mention ;-)
>
>I haven't actually used the second one very often; perhaps it might
>give problems with e.g. "number-vector" types that let you perform
>SOME number-like operations (such as "add a scalar to each item") but
>not others. The first one I use regularly and still find preferable
>to e.g. "isinstance(s, basestring)" which doesn't classify as "string
>like" such obvious cases as instances of UserString.UserString.
>
I wonder if
try: s and s[0]+'' or s+''
would serve as well, and protect against the big-s hit. Or is
there a sensible string-like thing that doesn't support logical
tests and indexing but does support adding '' ?
>Of course, this overall approach does depend on an underlying
>assumption that types are defined "sensibly" -- e.g. that if a type
>is string-like enough to let you concatenate its instances to a
>string, then it will also be string-like enough from other points
>of view. I have not found that to be a problem in practice.
>
Regards,
Bengt Richter
More information about the Python-list
mailing list