Timo wrote: > Op 28-08-12 10:06, Richard D. Moores schreef: >> On Tue, Aug 28, 2012 at 12:13 AM, Jerry Zhang <jerry.scofi...@gmail.com> >> wrote: >>> >>> 2012/8/28 Richard D. Moores <rdmoo...@gmail.com> >>> >>>> On Mon, Aug 27, 2012 at 6:33 PM, Japhy Bartlett <ja...@pearachute.com> >>>> wrote: >>>> >>>>> something like: >>>>> >>>>> def _validate_int(obj): >>>>> """Raise an exception if obj is not an integer.""" >>>>> m = int(obj + 0) # May raise TypeError. >>>>> if obj != m: >>>>> raise ValueError('expected an integer but got %r' % obj) >>>>> >>>>> >>>>> is a really awkward way to test if something's an integer, and >>>>> checking types in general is usually a sign of larger flaws in laying >>>>> out useful code. >>>> What the best way to test if something's an integer? >>> >>>>>> a = 4 >>>>>> isinstance(a, int) >>> True >>>>> isinstance(3., int) >> False >> >> 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.
Note that the original check takes the value into account, too: >>> import pyprimes >>> pyprimes._validate_int(1.0) >>> pyprimes._validate_int(1.5) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "pyprimes.py", line 286, in _validate_int raise ValueError('expected an integer but got %r' % obj) ValueError: expected an integer but got 1.5 >>> import fractions >>> pyprimes._validate_int(fractions.Fraction(10,2)) Personally, I'm a big fan of ducktyping, so I would probably remove the check completely and live with the consequences: >>> pyprimes._validate_int = lambda x: None >>> pyprimes.isprime_naive(8.5) True garbage-in, garbage-out -- so what. _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor