On 9/26/07, Guido van Rossum <[EMAIL PROTECTED]> wrote:
> ...
> Indexing
> --------
>
> **Open Issue:** I'm undecided on whether indexing bytes and buffer
> objects should return small ints (like the bytes type in 3.0a1, and
> like lists or array.array('B')), or bytes/buffer objects of length 1
> (like the str type). The latter (str-like) approach will ease porting
> code from Python 2.x; but it makes it harder to extract values from a
> bytes array.
Marcin was far more eloquent than I could hope to be, but I too prefer
indexing bytes to return a small int. My reasoning is a little more
academic: All iterable types except for str get simpler when you
iterate over them, so eventually you come to a type that isn't
iterable. It would be a shame to extend this misbehavior to bytes if
we have a chance to remove it.
For example, the recursive flatten() function gets more complicated
for each type that does this:
>>> list(flatten.flatten([1, [2, [3, [4, 5]]]]))
[1, 2, 3, 4, 5]
>>> list(flatten.flatten([1, [2, [3, ["str", 5]]]]))
[1, 2, 3, 's', 't', 'r', 5]
If all iterables iterated over a simpler type, we could use:
def flatten(iterable):
try:
for elem in iterable:
for elem in flatten(elem):
yield elem
except TypeError:
# Not iterable
yield iterable
but with strings, you need
def flatten(iterable):
try:
for elem in iterable:
if isinstance(elem, str) and len(elem) == 1:
yield elem
else:
for elem in flatten(elem):
yield elem
except TypeError:
# Not iterable
yield iterable
and another special case for each similar type.
Comparisons with literal bytes could be done with:
for b in bb:
if b == b'x'[0]: ...
or perhaps
if b == int(b'x'): ...
but you're right that's not ideal.
--
Namasté,
Jeffrey Yasskin
_______________________________________________
Python-3000 mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-3000
Unsubscribe:
http://mail.python.org/mailman/options/python-3000/archive%40mail-archive.com