python2.6 features / python2.5
Today I'll show you some quick and dirty python2.5 compatibility fixes. Of course you're developing on python2.6 or even python3.x, but your customer still lives in the dark ages. Here are two fixes that might come in handy.
ImportError: No module named ssl
Falling back to python2.5 socket.SSL
if there is no python2.6 ssl
through a small wrap_socket
replacement:
import socket
try:
from ssl import wrap_socket
except ImportError:
class wrap_socket:
def __init__(self, socket):
self.socket = socket
def __getattr__(self, name):
return getattr(self.socket, name)
def connect(self, *args, **kwargs):
self.socket.connect(*args, **kwargs)
self.ssl = socket.ssl(self.socket)
def read(self, *args, **kwargs):
return self.ssl.read(*args, **kwargs)
recv = read
def write(self, *args, **kwargs):
return self.ssl.write(*args, **kwargs)
send = write
AttributeError: 'unicode' object has no attribute 'format'
Falling back to python2.5 Template
if there is no python2.6
string.format
. It does not do any fancy formatting, but in many cases
you're not using that either. (Yes, for template syntax, {variable}
wins in readability over $variable
or, even worse, %(variable)s
.)
if not hasattr('', 'format'):
from string import Template
import re
def str_format(string, *args, **kwargs):
tpl = Template(string)
tpl.pattern = str_format.re
return tpl.substitute(*args, **kwargs)
str_format.re = re.compile(r'\{(?P<named>[A-Za-z0-9_]+)\}')
Usage:
try:
value = template.format(**values)
except AttributeError:
value = str_format(template, **values)