Re: [Python-Dev] Instance variable access and descriptors

2007-06-12 Thread Brian Harring
On Tue, Jun 12, 2007 at 08:10:26PM +1200, Greg Ewing wrote:
 Phillip J. Eby wrote:
  ...at the cost of slowing down access to properties and __slots__, by 
  adding an *extra* dictionary lookup there.
 
 Rather than spend time tinkering with the lookup order,
 it might be more productive to look into implementing
 a cache for attribute lookups. That would help with
 method lookups as well, which are probably more
 frequent than instance var accesses.

Was wondering the same; specifically, hijacking pep280 celldict 
appraoch for this.

Downside, this would break code that tries to do PyDict_* calls on a 
class tp_dict; haven't dug extensively, but I'm sure there are a few 
out there.

Main thing I like about that approach is that it avoids the staleness 
verification crap, single lookup- it's there or it isn't.  It would 
also be resuable for 280.

If folks don't much like the hit from tracing back to a cell holding 
an actual value, could always implement it such that upon change, the 
change propagates out to instances registered (iow, change a.__dict__, 
it notifies b.__dict__ of the change, etc, till it hits a point where 
the change doesn't need to go further).

~harring


pgphUjh4BMXhf.pgp
Description: PGP signature
___
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com


Re: [Python-Dev] best practices stdlib: purging xrange

2007-05-07 Thread Brian Harring
On Tue, May 08, 2007 at 09:14:02AM +1000, Anthony Baxter wrote:
 I'd like to suggest that we remove all (or nearly all) uses of 
 xrange from the stdlib. A quick scan shows that most of the usage 
 of it is unnecessary. With it going away in 3.0, and it being 
 informally deprecated anyway, it seems like a good thing to go away 
 where possible.
 
 Any objections?

Punt it when it's no longer useful (py3k); xrange exists for a 
reason- most usage just needs to iterate over a range of numbers 
(xrange), not instantiate a list of the range, then iterate over said 
range (range).  Don't much see the point in making stdlib more 
wasteful in runtime for an informally deprecated func that lots of 
folks in the real world still use.

~brian


pgpgTz8LwpEji.pgp
Description: PGP signature
___
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com


Re: [Python-Dev] PEP 30XZ: Simplified Parsing

2007-05-02 Thread Brian Harring
On Wed, May 02, 2007 at 01:53:01PM -0400, A.M. Kuchling wrote:
 On Wed, May 02, 2007 at 04:42:09PM +0100, Michael Foord wrote:
  Implicit string concatenation is massively useful for creating long 
  strings in a readable way though:
 
 This PEP doesn't seem very well-argued: It's a common mistake to
 leave off a comma, and then scons complains that it can't find
 'foo.cbar.c'.  Yes, and then you say oh, right! and add the missing
 comma; problem fixed!  The whole cycle takes about a minute.  Is this
 really an issue worth fixing?

The 'cycle' can also generally be avoided via a few good habits-

sourceFiles = [
 'foo.c',
 'bar.c',
 #...many lines omitted...
 'q1000x.c']

That's the original example provided; each file is on a seperate line 
so it's a bit easier to tell what changed if you're reviewing the 
delta.  That said, doing

sourceFiles = [
 'foo.c',
 'bar.c',
 #...many lines omitted...
 'q1000x.c',
]

is (in my experience) a fair bit better; you *can* have the trailing 
comma without any ill affects, plus shifting the ']' to a seperate 
line is lessy noisy delta wise for the usual add another string to 
the end of the list.

Personally, I'm -1 on nuking implicit string concatenation; the 
examples provided for the 'why' aren't that strong in my experience, 
and the forced shift to concattenation is rather annoying when you're 
dealing with code limits (80 char limit for example)-

dprint(depends level cycle: %s: 
   dropping cycle for %s from %s % 
(cur_frame.atom, datom,
 cur_frame.current_pkg),
cycle)

Converting that over isn't hard, but it's a great way to inadvertantly 
bite yourself in the butt- triple quote isn't usually much of an 
option in such a case also since you don't want the newlines coming 
through.

~harring


pgpeWCERdu4Ym.pgp
Description: PGP signature
___
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com


Re: [Python-Dev] a feature i'd like to see in python #1: better iteration control

2006-12-04 Thread Brian Harring
On Mon, Dec 04, 2006 at 07:15:35PM +0100, Martin v. L??wis wrote:
 Brian Harring schrieb:
  For dict; it actually *cannot* work.  You can't remove keys from a 
  dict as you're iterating over it (can change the val of a key, but not 
  remove the key).
 
 I think this is incorrect. The implementation could well support it,
 putting a dummy object into the deleted key (which deletion needs
 to do, anyway).

The implementation already uses a sentinel (NULL)- point was that it 
does not support iteration over a dict that's being deleted from 
*currently* though.

One thing to note; delitem is the easy case.  Allowing for mutating 
the mapping as you're iterating via delitem implies that setitem 
should work also; setitem however can trigger a resize.

Finally, if dicts were ever modified to shrink based on load, the 
resize there would be an issue.  Mind you I've not seen proposals of 
that sort, just pointing out the potential.


  So iter.delete would require fair bit of changes 
  internally to dict, either tracking what it's yielded already, or 
  forcing iterkeys to actually be iter(keys()) (creating an intermediate 
  list), which is worse for memory usage and general performance.
 
 I don't think either is necessary; deletion could occur directly.
 
  Set's suffer the same thing; can't change what it contains while 
  iterating, have to restart the iteration after a removal/addition.
 
 Again, I think that's incorrect.

Again, was refering to existing implementation (and long standing 
rules/conventions regarding it).  Set suffers the same issue with 
setitem meanwhile.

In my opinion, no point in doing the deltitem modification without a 
matching setitem.  Not saying I think the modification is worth it 
mind you, just that there should be symmetry ;)


~harring


pgp90qcXtW5fT.pgp
Description: PGP signature
___
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com


Re: [Python-Dev] a feature i'd like to see in python #1: better iteration control

2006-12-03 Thread Brian Harring
On Sun, Dec 03, 2006 at 06:24:17AM -0600, Ben Wing wrote:
 many times writing somewhat complex loops over lists i've found the need
 to sometimes delete an item from the list.  currently there's no easy
 way to do so; basically, you have to write something like
 
 i = 0
 while i  len(list):
   el =  list[i]
   ...do something...
   if el should be deleted:
 del list[i]
   else:
 i += 1
 
 note that you can't write
 
 for x in list:
 
 or even
 
 for i in xrange(len(list)):
 
 note also that you need to do some trickiness to adjust the index
 appropriately when deleting.
 
 i'd much rather see something like:
 
 for x:iter in list:
   ...do something...
   if x should be deleted:
 iter.delete()
 
 the idea is that you have a way of retrieving both the element itself
 and the iterator for the element, so that you can then call methods on
 the iterator.  it shouldn't be too hard to implement iter.delete(), as 
 well as iter.insert() and similar functions. (the recent changes to the 
 generator protocol in 2.5 might help.)
 
 the only question then is how to access the iterator.  the syntax i've 
 proposed, with `x:iter', seems fairly logical (note that parallels with 
 slice notation, which also uses a colon) and doesn't introduce any new 
 operators. (comma is impossible since `for x,iter in list:' already has 
 a meaning)
 
 btw someone is probably going to come out and say why don't you just 
 use a list comprehension with an `if' clause?  the problems are [1] i'd
 like this to be destructive; 

Just use slice assignment.

l = list(xrange(100))
l2 = [x for x in l if x  50]
l[:] = l2[:]

 [2] i'd like this to work over non-lists as well, e.g. hash-tables; 

There in is the sucky part; iterator protocol is simple; what you're 
proposing is extending iterators so that they recall the last value 
(else iter.delete() would not do anything), which... eh.

Think it sucks, to say the least ;)

Simple example of where this gets ugly is in iterating over a file.

[3] list comprehensions work well in simple
 cases, but in more complicated cases when you may be doing various 
 things on each step, and might not know whether you need to delete or 
 insert an element until after you've done various other things, a list 
 comprehension would not fit naturally; 

Slice assignments work fine here.

 [4] this mechanism is extendible 
 to insertions, replacements and other such changes as well as just 
 filterings.

Yes it is, except the new 'iterator' isn't as extendable to arbitrary 
sequences after.

Also is ignoring the fact that doing in place deletion of lists as you 
walk can get massively costly quick; worst case, quad for removal 
(hence collections.deque existing).

~harring


pgp1wNWIKrLn7.pgp
Description: PGP signature
___
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com


Re: [Python-Dev] a feature i'd like to see in python #1: better iteration control

2006-12-03 Thread Brian Harring
On Sun, Dec 03, 2006 at 08:35:58PM -0600, Ben Wing wrote:
 but i still don't see why supporting iter.delete() is so wrong.  clearly 
 it doesn't need to work on files or other such things where it doesn't 
 make sense.

 before you diss this completely, note that java supports exactly the 
 same thing:
 
 http://java.sun.com/j2se/1.4.2/docs/api/java/util/Iterator.html

Not all iterators would support remove; that right there is a bit of 
an issue since right now, the only exception you need to expect for 
iterator protocol is StopIteration being thrown when the iterator has 
nothing more to yield.

So, it's no longer simpler, which is a bit of a con in my opinion.

Question is, where _would_ it work?  Doesn't really make much 
sense for generators (doable with 2.5, but most generators are just 
that, generators, not modifiable views), doesn't make sense for 
itertools.* for the most part, since it's combination of iterators.

For dict; it actually *cannot* work.  You can't remove keys from a 
dict as you're iterating over it (can change the val of a key, but not 
remove the key).  So iter.delete would require fair bit of changes 
internally to dict, either tracking what it's yielded already, or 
forcing iterkeys to actually be iter(keys()) (creating an intermediate 
list), which is worse for memory usage and general performance.

Set's suffer the same thing; can't change what it contains while 
iterating, have to restart the iteration after a removal/addition.

Tuples are immutable, so end of discusion there.

Leaves lists... which personally, I view as a mostly bad thing to be 
doing anyways.  Trying to pop an item out of the middle of a list 
results in shifting everything right of it one spot to the left; this 
sucks from a performance standpoint, again, worst case, quad.

Now... occasionally, have to do it admittedly.  But it's not something 
you actaully want to be doing in your code all that much- admittedly 
generating a new list to avoid that hit also sucks somewhat, but the 
worst case there is far more behaved, a temp trade of space vs 
runtime.

What I'm trying to get at is that what iter(list).next().delete() 
would do isn't a good thing to paper over, it makes the op look like 
it costs nothing when it can cost a _lot_.

Unless I'm missing something, the only real usage of this is a list 
(could do it on files also, although that would suffer the same 
issue as a list, just worse via truncate calls).  Would work better on 
collections.deque, but deque is a linked list and used rather 
selectively.

So... why add it, if it's basically for one major type, and it's 
not a good idea to blindly do such an action on that type in the first 
place? 

~harring


pgpRxoOMQd1ba.pgp
Description: PGP signature
___
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com


Re: [Python-Dev] Suggestion for a new built-in - flatten

2006-09-22 Thread Brian Harring
On Fri, Sep 22, 2006 at 12:05:19PM -0700, Bob Ippolito wrote:
 On 9/22/06, Josiah Carlson [EMAIL PROTECTED] wrote:
 
  Michael Foord [EMAIL PROTECTED] wrote:
  
   Hello all,
  
   I have a suggestion for a new Python built in function: 'flatten'.
 
  This has been brought up many times.  I'm -1 on its inclusion, if only
  because it's a fairly simple 9-line function (at least the trivial
  version I came up with), and not all X-line functions should be in the
  standard library.  Also, while I have had need for such a function in
  the past, I have found that I haven't needed it in a few years.
 
 I think instead of adding a flatten function perhaps we should think
 about adding something like Erlang's iolist support. The idea is
 that methods like writelines should be able to take nested iterators
 and consume any object they find that implements the buffer protocol.

Which is no different then just passing in a generator/iterator that 
does flattening.

Don't much see the point in gumming up the file protocol with this 
special casing; still will have requests for a flattener elsewhere.

If flattening was added, should definitely be a general obj, not a 
special casing in one method in my opinion.
~harring


pgpudc8tPUGor.pgp
Description: PGP signature
___
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com