Reputation: 170856
I am writing a module that is supposed to work in both Python 2 and 3 and I need to define a binary string.
Usually this would be something like data = b'abc'
but this code code fails on Python 2.5 with invalid syntax.
How can I write the above code in a way that will work in all versions of Python 2.5+
Note: this has to be binary
(it can contain any kind of characters, 0xFF), this is very important.
Upvotes: 7
Views: 9699
Reputation: 91159
You could store the data base64-encoded.
First step would be to transform into base64:
>>> import base64
>>> base64.b64encode(b"\x80\xFF")
b'gP8='
This is to be done once, and using the b
or not depends on the version of Python you use for it.
In the second step, you put this byte string into a program without the b
.
Then it is ensured that it works in py2 and py3.
import base64
x = 'gP8='
base64.b64decode(x.encode("latin1"))
gives you a str
'\x80\xff'
in 2.6 (should work in 2.5 as well) and a b'\x80\xff'
in 3.x.
Alternatively to the two steps above, you can do the same with hex data, you can do
import binascii
x = '80FF'
binascii.unhexlify(x) # `bytes()` in 3.x, `str()` in 2.x
Upvotes: -3
Reputation: 172437
I would recommend the following:
from six import b
That requires the six module, of course. If you don't want that, here's another version:
import sys
if sys.version < '3':
def b(x):
return x
else:
import codecs
def b(x):
return codecs.latin_1_encode(x)[0]
These solutions (essentially the same) work, are clean, as fast as you are going to get, and can support all 256 byte values (which none of the other solutions here can).
Upvotes: 6
Reputation: 67040
If the string only has ASCII characters, call encode
. This will give you a str
in Python 2 (just like b'abc'
), and a bytes
in Python 3:
'abc'.encode('ascii')
If not, rather than putting binary data in the source, create a data file, open it with 'rb'
and read from it.
Upvotes: 2