Hi,

Robert Bradshaw wrote:
>>>  --- a.pyx ---
>>>
>>>  def foo(x):
>>>      if x > 0:
>>>          return "good"
>>>      else:
>>>          return "bad"
>>>  -------------
>>>
>>>  import a
>>>  print "3 is %s" % a.foo(3)
>>>
>>>  won't work in both Py2 and Py3, which I think it should. "Principle
>>>  of least surprise."
> 
> What it does mean is that you have to ship two separate sets of C  
> files,

Not at all. You just have to state what you mean *in your source file*, i.e.
in your Cython source. If you say "I want this literal to be a byte string",
you will get a byte string in both Py2 and Py3. If you say "I want this
literal to be a unicode string", you will get a unicode string in both Py2 and
Py3. How is that a surprise?

Just because your code assumes that a byte string is the same as a unicode
string does not mean Cython has to take measures to fix this for you,
especially in a way that you might or might not have intended. Be explicit.

You now have a number of ways to say what a literal should be, based on the
Py2 syntax + the 'b' prefix of Py3:

   u"abc"   # a unicode string
   "abc"    # a byte string
   b"abc"   # a byte string

You can do

   from __future__ import unicode_literals

   u"abc"   # a unicode string
   "abc"    # a unicode string
   b"abc"   # a byte string


This is actually different from Py3 (and I think in line with 2.6) in that
both the 'u' prefix and the 'b' prefix are allowed at the same time. I think
that's ok, you will just have to use them wisely. Some style guide policies
will save your project here. ;)

Stefan
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to