On 11/01/2012 07:12 AM, Ethan Furman wrote:
Andrew Robinson wrote:
  On 10/31/2012 02:20 PM, Ian Kelly wrote:
On Wed, Oct 31, 2012 at 7:42 AM, Andrew Robinson  wrote:
Then; I'd note:  The non-goofy purpose of slice is to hold three
data values;  They are either numbers or None.  These *normally*
encountered values can't create a memory loop.
So, FOR AS LONG, as the object representing slice does not contain
an explicit GC pair; <snip>

A little review...
The premise of my statement here, is that Tim Peter's closed the Bug report;

http://bugs.python.org/issue1501180
With the *reason* being that using GC was *goofy* on account of what slice() was intended 
to hold, None and a number.  So, My first attempt at bug fix was simply to take Tim 
Peter's at his word... since we all assume he *isn't* a "Bloody Idiot".  Hey 
isn't that a swear-word somewhere in the world?  Its not where I live, but I seem to 
recall... oh, well... whatever.

I missed something... (but then that's why we're still talking about it...)

Reading the PEP, it notes that *only* integers (or longs) are permitted in slice syntax.

Keep in mind that PEPs represent Python /at that time/ -- as Python
moves forward, PEPs are not updated (this has gotten me a couple times).
And, since I am reading them in the order written (but in 3.0) trying to get the whole of Python into my mind on the journey to prep for porting it into a tiny chip -- I'm frustrated by not being finished yet...

Furman, actually.  :)
:-!


And my values do *not* convert to indices (at least, not automatically).
Ahhh.... (Rhetorical & sarcastic) I was wondering how you added index() method to strings, not access it, and still be following the special PEP we are talking about,when you gave that example using unwrapped strings.

--------------------------

Hmmmm.... was that PEP the active state of Python, when Tim rejected the bug report? eg: have we "moved on" into a place where the bug report ought to be re-issued since that PEP is now *effectively* passe, and Tim could thus be vindicated from being a "b... Idiot?" (Or has he been given the 1st place, Python Twit award -- and his *man* the bug list been stripped?)

In other words, the slice contains the strings, and my code calculates
the offsets -- Python doesn't do it for me.

~Ethan~

I see, so the problem is that PEP wants you to implement the index(), but that is going to cause you to subclass string, and add a wrapper interface every time you need to index something. eg: doing something llke --- mydbclass[ MyString( 'fromColumn' ) : MyString( 'toColum' ) ] and the code becomes a candy machine interface issue (Chapter 5, Writing Solid Code).

My favorite line there uses no swearing .... "If they had just taken an extra *30* seconds thinking about their design, they could have saved me, and I'm sure countless others, from getting something they didn't want." I laugh, if they didn't get it already -- an extra *30* seconds is WAAAAY to optimistic. Try minutes at least, will a policeman glaring over their shoulder.

But anyhow --- The problem lies in *when* the conversion to an integer is to take place, not so much if it is going to happen. Your indexes, no matter how disguised, eventually will become numbers; and you have a way that minimizes coding cruft (The very reason I started the thread, actually... subclassing trivially to fix candy machine interfaces leads to perpetual code increases -- In cPython source-code, "realloc" wrappers and "malloc" wrappers are found .... I've seen these wrappers *re*-invented in nearly every C program I've every looked at! Talk about MAN-hours, wasted space, and cruft.)

So; is this a reasonable summary of salient features (status quo) ?

 * Enforcing strict numerical indexes (in the slice [::] operator)
   causes much psychological angst when attempting to write clear code
   without lots of wrapper cruft.
* Pep 357 merely added cruft with index(), but really solved nothing. Everything index() does could be implemented in __getitem__ and
   usually is.
 * slice().xxxs are merely a container for *whatever* was passed to [::]
 * slice() is
 * slice is also a full blown object, which implements a trivial method
   to dump the contents of itself to a tuple.
 * presently slice() allows memory leaks through GC loops.
 * Slice(), even though an object with a constructor, does no error
   checking to deny construction of memory leaks.

If people would take 30 seconds to think about this.... the more details added -- the more comprehensive can be my understanding -- and perhaps a consensus reached about the problem.
These are a list of relevant options, without respect to feasability.

 * Don't bother to fix the bug; allow Python to crash with a subtle bug
   that often take weeks to track down by the very small minority doing
   strange things (Equivalent to the "monkey patch" syndrome of
   D'Aprano; BTW: The longer the bug is left unfixed, the more people
   will invent "uses" for it )
 * Convert the specially coded Slice() object into a normal Python
   object (essentially adds the GC);  This can be a "named" tuple, or
   an immutable object with slots..., or just adding GC to existing object.
 * Work through the difficult problem of guessing all the different
   ways people will want to use slice() to represent indexes; and then
   raise exceptions IN THE SLICE CONSTRUCTOR when a usage is tried
   outside these ways. (caveat, if a reasonable idea for loops is found
   -- we *must* implement GC.)
 * Improve the GC so that memory loops aren't a problem in the first place.

And here's a list of qualms:

 * Adding bytes of memory for GC isn't worth it...
 * Removing bytes of GC from other objects when loops would be rare
   isn't worth it....
 * Doing things which violate the present *theoretical* API will cause
   *subtle* bugs...
 * Fixing something in a way breaking a general paradigm (no GC)
   enlarges code, and makes generalizations about the language full of
   complex exceptions hard to code for.

Did I miss anything important???

So finally, here's a list of missing information, and I'd *REALLY* appreciate someone helping me figure out how to profile memory usage in Python with an example, or link, for solving any of the following.

 * As a fraction of the used memory (at fixed points in time) of a
   typical Python program:
     o How much is used by GC?
     o How much is used by slice objects?
     o How much will be used by additional GC if added to slice objects
       (can be calculated).
     o How much is used by generic tuples?
 * As a fraction of tuples used for generic purposes in Python
     o How many contain only data elements that are basic Python types
       without ability to create loops; Strings, floats, self contained
       objects.  (I'm thinking a flag might be useful to decide when GC
       may be omitted in these cases).

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to