|
From: Billy G. A. <bg...@mu...> - 2002-07-30 02:32:56
|
Gerhard =?iso-8859-1?Q?H=E4ring?= wrote:
> * Adam Buraczewski <ad...@po...> [2002-07-29 00:46 +0200]:
> > Hallo,
> >
> > Recently I found that some PgXXX classes defined in PgSQL module lack
> > some features I would expect because of the fact that they are
> > wrappers around PostgreSQL basic data types. For example, PgNumeric
> > class is a wrapper around "numeric" type, so it should behave like a
> > Python number: it should be comparable to other numeric Python types
> > and it should be usable as a logical value (false when zero and true
> > when non-zero). However, PgNumeric values behave differently: they
> > cannot be compared to other, non-PgNumeric, types/classes and they
> > always are "true" in logical expressions despite of their real value.
> > I found the patch on pyPgSQL site which solves the latter problem,
>
> Committed now with the addition of __pos__ and __abs__ (for the + and
> abs unary "operators").
>
> > but the first one still exists.
>
> Indeed. It's not obvious for me how to fix this, as I'm not very
> proficient with emulating numeric types. It _seems_ that you can get a
> lot further by just adding something like this at the start of
> PgNumeric's __coerce__ method:
>
> if not isinstance(other, PgNumeric):
> other = PgNumeric(str(other))
>
> I have a gut feeling, however, that this isn't all that'll be involved
> for PgNumerics. That's why I haven't commited this, yet.
>
> > IMHO the most annoying problem is that PgNumeric values cannot be
> > compared to data values of other type, for example following
> > expressions:
> >
> > PgNumeric('123.45') == None
>
> Ouch! As has been said already, this isn't good practise. But I learnt
> it only relatively recently myself. The reason is that None is a
> singleton and singletons are best compared using "is". This avoids
> potential bugs, and is a lot faster.
>
> > [...] Especially comparing values to None is very popular in database
> > applications as None represents NULL value, am I not right? :)
>
> Yeah. That's why you should do it like in SQL and compare using the
> "is"-operator :)
>
> > Since I am going to write some new programs using pyPgSQL library, I
> > think I could contribute a patch to PgSQL module, which would solve
> > problems described above. However I would like to know:
> >
> > 1. if compatibility with Python < 2.1 should be kept (I would like to
> > use new __lt__, __eq__ etc. method names instead of __cmp__),
>
> I myself haven't used Python 2.0 for years, but it's probably a bad idea
> to break Python 2.0 compatibility in the pyPgSQL 2.x line at this point.
> If you'd like to contribute to the upcoming (not started yet) pyPgSQL 3.0
> instead, you could even use all the cool Python 2.2-only features ;-)
>
> > 2. if PgNumeric, PgInt8 and other wrappers around PostgreSQL numeric
> > types should be comparable to each other or to standard Python numeric
> > types (float, long, int) only.
>
> IMO, they should be comparable to all numeric types. I just noticed that
> currently, they aren't.
I noticed that, at least in Python 2.2, that coerce is not being called. I should have a fix for this shortly.
--
____ | Billy G. Allie | Domain....: Bil...@mu...
| /| | 7436 Hartwell | MSN.......: B_G...@em...
|-/-|----- | Dearborn, MI 48126|
|/ |LLIE | (313) 582-1540 |
|