<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Guido van Rossum wrote:
<blockquote
 cite="mid:ca471dc20709271039jd22f91dm803d2d2551980d42@mail.gmail.com"
 type="cite">
  <pre wrap="">I think I've been convinced that b[0] should return an int in range(256).</pre>
</blockquote>
<br>
This made me feel funny.&nbsp; I stared at this for a while:<br>
&nbsp;&nbsp;&nbsp; b'a' != b'abcde'[0]&nbsp; ?!?<br>
&nbsp;&nbsp;&nbsp; b'a'[0] != b'a' ?!?<br>
<br>
Then I realized that making b[0] return an int simply makes bytes
objects behave less like strings, and more like tuples of integers:<br>
&nbsp;&nbsp;&nbsp; ( 97, ) != ( 97, 98, 99, 100, 101 )<br>
&nbsp;&nbsp;&nbsp; ( 97, )[0] != ( 97, )<br>
Strings have always been the odd man out; no other sequence type has
this individual-elements-are-implicitly-sequences-too behavior.<br>
<br>
So now bytes are straddling the difference between strings and the
other mapping types:<br>
<br>
tuple:<br>
&nbsp;&nbsp;&nbsp; to construct one with multiple elements: ( 97, 98, 99, 100, 101 )<br>
&nbsp;&nbsp;&nbsp; elements aren't implicitly sequences: ( 97, ) != ( 97, 98, 99 )[0]<br>
list:<br>
&nbsp;&nbsp;&nbsp; to construct one with multiple elements: [ 97, 98, 99, 100, 101 ]<br>
&nbsp;&nbsp;&nbsp; elements aren't implicitly sequences: [ 97, ] != [ 97, 98, 99 ][0]<br>
bytes:<br>
&nbsp;&nbsp;&nbsp; to construct one with multiple elements: b"abcde"<br>
&nbsp;&nbsp;&nbsp; elements aren't implicitly sequences: b"a" != b"abcde"[0]<br>
str:<br>
&nbsp;&nbsp;&nbsp; to construct one with multiple elements: "abcde"<br>
&nbsp;&nbsp;&nbsp; elements are implicity sequences: "a" == "abcde"[0]<br>
<br>
So what should the bytes constructor take?&nbsp; We all already know it
should <b>not</b> take a string.&nbsp; (You must explicitly decode a string
to get a bytes object.)&nbsp; Clearly it should take an int in the proper
range:<br>
&nbsp;&nbsp;&nbsp; bytes(97) == b'a'<br>
and a bytes object:<br>
&nbsp;&nbsp;&nbsp; bytes(b'a') == b'a'<br>
&nbsp;&nbsp;&nbsp; bytes(b'abcde') == b'abcde'<br>
Like the tuple and list constructors, I think it should also attempt to
cast iterables into its type.&nbsp; So if you pass in an iterable, and the
iterable contains nothing but ints in the proper range, it should
produce a bytes object:<br>
&nbsp;&nbsp;&nbsp; bytes( [ 97, 98, 99, 100, 101] ) == b'abcde'<br>
<br>
Sorry if this is obvious to everybody; thinking through it helped me,
at least.<br>
<br>
<br>
<i>larry</i><br>
</body>
</html>