[Tutor] Why begin a function name with an underscore

Peter Otten __peter__ at web.de
Tue Aug 28 12:00:32 CEST 2012


Richard D. Moores wrote:

> On Tue, Aug 28, 2012 at 1:21 AM, Timo <timomlists at gmail.com> wrote:
>> Op 28-08-12 10:06, Richard D. Moores schreef:
> 
>>> What if I wanted 3., 1234., etc. to be considered ints, as they are by
>>> _validate_int()  ?
>>
>>
>>>>> isinstance(3., (int, float))
>> True
>>
>> Because 3. is a float, not int.
> 
> And
>>>> isinstance(3.7, (int, float))
> True
> 
> No, I'm asking for something equivalent to _validate_int().

That's not how it works. You have to give a spec first and then you can 
compare how well it is met by a particular implementation. If you start with 
an implementation and then declare its behaviour to be the spec the 
implementation will always "win". That's why ISO 29500 works so well -- for 
the company that wrote it.

Anyway here's an alternative implementation:

>>> def vi(x):
...     if not isinstance(x, numbers.Number):
...             raise TypeError
...     if not int(x) == x:
...             raise ValueError
... 
>>> vi("")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in vi
TypeError
>>> vi(1.5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in vi
ValueError
>>> vi(1.0)
>>>

The differences to _validate_int() are subtle:

>>> class S(str):
...     def __eq__(self, other): return True
...     def __ne__(self, other): return False
...     def __add__(self, other): return self
... 
>>> vi(S("42"))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in vi
TypeError
>>> _validate_int(S("42"))
>>>





More information about the Tutor mailing list