PyWart: Language missing maximum constant of numeric types!

R

Rick Johnson

I get sick and tired of doing this!!!

if maxlength == UNLIMITED:
allow_passage()
elif len(string) > maxlength:
deny_passage()

What Python needs is some constant that can be compared to ANY numeric
type and that constant will ALWAYS be larger!
 
M

Mark Lawrence

I get sick and tired of doing this!!!

if maxlength == UNLIMITED:
allow_passage()
elif len(string)> maxlength:
deny_passage()

What Python needs is some constant that can be compared to ANY numeric
type and that constant will ALWAYS be larger!

Do you want to test for something that is larger than infinity?
 
R

Rick Johnson

Do you want to test for something that is larger than infinity?

Not exactly. I want to set a constant that has a value of infinity and
then do comparisons against the constant.

##################
# Hypothetical 1 #
##################

def confine(string, maxlength=INFINITY):
return string[:maxlength]

py> confine('123')
'123'
py> confine('123', 1)
'1'

##################
# Hypothetical 2 #
##################

def confine(string, maxlength=INFINITY):
if len(string) < maxlength:
do_something()
else:
twiddle_thumbs()
 
N

Neil Cerutti

I get sick and tired of doing this!!!

if maxlength == UNLIMITED:
allow_passage()
elif len(string) > maxlength:
deny_passage()

What Python needs is some constant that can be compared to ANY
numeric type and that constant will ALWAYS be larger!

What's the point of that?

The only time I've naively pined for such a thing is when
misapplying C idioms for finding a minimum value.

Python provides an excellent min implementation to use instead.
 
R

Rick Johnson

float('infinity') should be good enough.

Yes, that is the answer however the implementation is inconsistent.

py> float("inf")
inf
py> float("infinity")
inf
py> int("inf")
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
int("inf")
ValueError: invalid literal for int() with base 10: 'inf'
py> int("infinity")
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
int("infinity")
ValueError: invalid literal for int() with base 10: 'infinity'

The best place for INFINITY is a constant of the math module.

# Hypothetical #
py> from math import INFINITY
py> 1 < INFINITY
True
py> 99999999999999999 < INFINITY
True
 
M

Mel Wilson

Rick said:
I get sick and tired of doing this!!!

if maxlength == UNLIMITED:
allow_passage()
elif len(string) > maxlength:
deny_passage()

What Python needs is some constant that can be compared to ANY numeric
type and that constant will ALWAYS be larger!

Easily fixed:



class Greatest (object):
def __cmp__ (self, other):
if isinstance (other, Greatest):
return 0
return 1

def __hash__ (self):
return id (Greatest)

class Least (object):
def __cmp__ (self, other):
if isinstance (other, Least):
return 0
return -1

def __hash__ (self):
return id (Least)



Mel.
 
R

Rick Johnson

What's the point of that?

The only time I've naively pined for such a thing is when
misapplying C idioms for finding a minimum value.

The best use case is for default arguments to constructors or func/
meths. If you set the argument to INFINITY instead of -1 (or some
other dumb string value to mean "unlimited") you can omit a useless
conditional block later. Observe:

if maxlength == -1 # unlimited length:
keep_going()
elif len(object) < maxlength:
stop() # because we reached the limit

I see tons and tons of old Python code that uses -1 as an "unlimited"
value, where positive numbers are meant to constrain dome value. I
have always found that to be intuitive; hence my question.
 
S

Steven D'Aprano

Easily fixed:



class Greatest (object):
def __cmp__ (self, other):
if isinstance (other, Greatest):
return 0
return 1

def __hash__ (self):
return id (Greatest)

__cmp__ no longer exists in Python 3, so this solution could only work in
Python 2.

Here's a version using rich comparisons:

class Greatest:
__eq__ = __le__ = lambda self, other: isinstance(other, type(self))
__ne__ = __gt__ = lambda self, othr: not isinstance(othr, type(self))
__lt__ = lambda self, other: False
__ge__ = lambda self, other: True
__hash__ = lambda self: 42
 
R

Rick Johnson

Easily fixed:

[...snip code...]

Yes i could write my own implementation of INFINITY if i wanted,
although i would have returned True and False as apposed to 1 and 0
AND used the identifiers Infinity and Infinitesimal, but i digress :-
P.

However, INFINITY is something i believe a language should provide;
which python does, albeit inconsistently.
 
M

Michael Torrie

Yes i could write my own implementation of INFINITY if i wanted,
although i would have returned True and False as apposed to 1 and 0
AND used the identifiers Infinity and Infinitesimal, but i digress :-
P.

However, INFINITY is something i believe a language should provide;
which python does, albeit inconsistently.

How do you represent infinity as an binary integer number? Or are you
suggesting that the integer type (class) be modified to allow an
"infinity" state that really isn't a number at all (could not be stored
as a integer in C)?

Float is a different story because IEEE does define a binary
representation of infinity in the floating-point specification.

I know of no language that has any form of representation of infinity
for integers mainly because there's no way to represent infinity as a
standard twos-compliment binary number. In a language that deals
directly with types in memory such as C, having an infinity
representation would be possible but would make simple math really hard,
and much slower.

All this reminds me of the original cray supercomputers. They didn't
use twos compliment for integers so they had two representations of zero
(+0 and -0). Made programming a bit tricky. When asked why the cray
didn't just do two's compliment like everyone else, Seymour Cray
responded that when the computer was designed he simply didn't know
about twos compliment.
 
M

Mark Lawrence

How do you represent infinity as an binary integer number? Or are you
suggesting that the integer type (class) be modified to allow an
"infinity" state that really isn't a number at all (could not be stored
as a integer in C)?

The C integer bit doesn't matter since e.g.10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L

And no, I'm not going to calculate how much memory I'd need to store a
string that's this long :)
 
D

Devin Jeanpierre

The only time I've naively pined for such a thing is when
misapplying C idioms for finding a minimum value.

Python provides an excellent min implementation to use instead.

min can be a little inconvenient. As soon as anything complicated has
to be done during the min expression, you need to switch to using
something else for sanity's sake. In that vein, I do actually
sometimes use float('inf') (for numbers), or a custom max/min object.

----

Silly and completely nonserious addendum:

Forgive me, I have spoken in error! min is the one true way, for you
can still do it with a little wrangling, as follows:

@operator.itemgetter(1)
@min
@apply
def closest_object():
for x in xrange(board_width)
for y in xrange(board_height):
try:
entity = board.get_entity(x, y)
except EntityNotFound:
pass
else:
yield distance(player.pos, entity.pos), entity


Please don't kill me.

-- Devin
 
S

Steven D'Aprano

All this reminds me of the original cray supercomputers. They didn't
use twos compliment for integers so they had two representations of zero
(+0 and -0). Made programming a bit tricky.

While there is only one integer zero, I would like to point out that in
floating point, there are usually two zeroes, -0.0 and +0.0, and that
this is by design and a feature, not an accident or a bug.

Well-written floating point functions should keep the sign when they
underflow, e.g.:

py> 1e-200 * 1e-200
0.0
py> 1e-200 * -1e-200
-0.0

and well-written functions should honour those separate zeroes because
sometimes it makes a difference.
 
M

Michael Torrie

The C integer bit doesn't matter since e.g.
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L

And no, I'm not going to calculate how much memory I'd need to store a
string that's this long :)

Sure but that doesn't answer the question posed. How does Rick plan to
represent an infinite integer? Obviously you've shown that with an
infinite amount of memory we could do it quite easily. But baring that,
how does Rick suggest we should represent an infinite integer?
 
C

Chris Angelico

Sure but that doesn't answer the question posed.  How does Rick plan to
represent an infinite integer? Obviously you've shown that with an
infinite amount of memory we could do it quite easily.  But baring that,
how does Rick suggest we should represent an infinite integer?

Barring a suggestion from Rick, I think we should define the number 8
to be greater than all other integers. After all, Rick's very much in
favour of evolution, and what would better depict the evolution of
this glorious language than this notation, showing that the infinity
symbol is now walking erect!

ChrisA
 
M

Mark Lawrence

Sure but that doesn't answer the question posed. How does Rick plan to
represent an infinite integer? Obviously you've shown that with an
infinite amount of memory we could do it quite easily. But baring that,
how does Rick suggest we should represent an infinite integer?

I understand that a Python integer can run to infinity. Quite how the
illustrious rr manages to test for the length of a string that's already
used all of the memory on his system has baffled me, but I'm sure that
all the people who frequent this list with their Phds, MScs or whatever
will soon correct me.
 
M

MRAB

Sure but that doesn't answer the question posed. How does Rick plan to
represent an infinite integer? Obviously you've shown that with an
infinite amount of memory we could do it quite easily. But baring that,
how does Rick suggest we should represent an infinite integer?

We already have arbitrarily long ints, so there could be a special
infinite int singleton (actually, 2 of them, one positive, the other
negative).
 
I

Ian Kelly

min can be a little inconvenient. As soon as anything complicated has
to be done during the min expression, you need to switch to using
something else for sanity's sake. In that vein, I do actually
sometimes use float('inf') (for numbers), or a custom max/min object.

----

Silly and completely nonserious addendum:

Forgive me, I have spoken in error! min is the one true way, for you
can still do it with a little wrangling, as follows:

   @operator.itemgetter(1)
   @min
   @apply
   def closest_object():
       for x in xrange(board_width)
           for y in xrange(board_height):
               try:
                   entity = board.get_entity(x, y)
               except EntityNotFound:
                   pass
               else:
                   yield distance(player.pos, entity.pos), entity

Cute, but what's so terrible about:

def all_entities():
for x in xrange(board_width):
for y in xrange(board_height):
try:
yield board.get_entity(x, y)
except EntityNotFound:
pass

closest_object = min(all_entities,
key=lambda e: distance(player.pos, e.pos))

Especially given that all_entities should be reusable in other contexts.

Cheers,
Ian
 
S

Steven D'Aprano

Seconded. Although would a wish request to bugs.python.org saying "Allow
storage of the integer infinity" make any sense to the developers? :p

If you explained it as a pair of special int values, INF and -INF, rather
than the storage of an infinite-sized integer, it would make perfect
sense.

But it would also be rejected, and rightly so, as unnecessary complexity
for the int type. There are already Decimal and float infinities, just
use one of them. Or make your own, it's not difficult. Publish it on
ActiveState, and if people flock to use it, then you will have a good
argument that this is useful and should be part of the Python built-ins.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top