Python 2.6 introduced the format method to strings.
In general, format is now the preferred way to build strings
instead of the old % formatting operator.
One exception is with the logging module,
where the best practice is to use %s and %d.
Why?
First, %s is the idiomatic way to use logging,
which was built years before format was introduced.
Second, if there's a literal % in the interpolated values,
logging will be unhappy,
since there won't be corresponding arguments in the call.
It won't fall over, since
“The logging package is designed to swallow exceptions which occur while logging in production.
This is so that errors which occur while handling logging …continue.
Yesterday, while at PyCon,
I whipped up a quick, brute-force answer
to the HouseCanary PyCon2016 Progamming Challenge
in a few minutes.
That was sufficient to pass the first two test cases
and win me a very pretty HouseCanary t-shirt.
The answer ran in O(n⁴) time, so it failed miserably on the larger problem sets
in the third and fourth cases.
I mulled it over and came up with an O(n²) solution that runs in reasonable time
on the larger problem sets.
On the second test case, input1.txt, runtime drops from 5.2s to 0.2s.
I submitted my new answer.
I'll learn on Monday if I won the speed challenge.
I made a number of updates to the FlyingCloud Documentation tonight.
I hope to give a lightning talk about FlyingCloud
at PyCon on Monday evening or Tuesday morning,
and I put together some slides for that too.
I like to use io.StringIO rather than the older cStringIO.StringIO,
as it's Python 3–ready
io.StringIO is also a context manager:
if you use it in a with statement,
the string buffer is automatically closed as you go out of scope.
I tried using io.StringIO with unicodecsv,
as I wanted to capture the CSV output into a string buffer
for use with unit tests.
unicodecsv is a drop-in replacement for Python's built-in csv module,
which supports Unicode strings.
with io.StringIO() as csv_file:
write_csv_rows(csv_file)
lines = csv_file.getvalue().split('\r\n')
return lines[:-1] # drop empty line after trailing \r\n
It failed horribly with
TypeError: unicode argument expected, …continue.
I rarely use doctests, but I do have some code that uses them.
Although I still mostly write Python 2,
I usually import several features of Python 3:
from __future__ import unicode_literals, print_function, absolute_import
Unfortunately unicode_literals doesn't play well with doctests.
The following code will pass with python2 -m doctest demo.py,
but not with python3:
from __future__ import unicode_literals, print_function, absolute_import
def upper(s):
"""
Convert `s` to upper case.
>>> upper('Hello!')
u'HELLO!'
"""
return s.upper()
Python 3 complains:
Failed example:
upper('Hello!')
Expected:
u'HELLO!'
Got:
'HELLO!'
The …continue.
Despite being a bona fide performance expert—I spent a couple of years as the Performance Lead
for Microsoft's IIS web server product about 15 years ago—I still forget to measure rather than assume.
I wrote some code today that imported nearly 300,000 nodes into a graph
from a 500MB XML file.
The code was not particularly fast and I assumed that it was the XML parser.
I had been using the built-in streaming parser, cElementTree iterparse.
I assumed that using the lmxl iterparse would make the code faster.
It didn't.
Then I had the bright idea of temporarily disabling the per-node processing,
which left only the XML parsing.
Instead of …continue.
I wanted to raise Python's IOError for a file-not-found condition,
but it wasn't obvious what the parameters to the exception should be.
from errno import ENOENT
if not os.path.isfile(source_file):
raise IOError(ENOENT, 'Not a file', source_file)
with open(source_file) as fp:
return fp.read()
IOError can be instantiated with 1, 2, or 3 arguments:
- IOError(errno, strerror, filename)
- These arguments are available
on the errno, strerror, and filename attributes of the exception object,
respectively, in both Python 2 and 3.
The args attribute contains the verbatim constructor arguments as a tuple.
- IOError(errno, strerror)
- These are available on the errno and strerror attributes of the exception,
respectively, in both Python 2 and …continue.
Last night,
Adam Porad and I were one of five teams
pitching our startups at the
PuPPy-organized PyCon Startup Row Pitch Night:
Techstars Seattle and PuPPy [Puget Sound Programming Python]
presents PyCon Startup Row Pitch Night.
The time has come again for you, the members of PuPPy,
to select Seattle’s startup representative to travel
to PyCon in Portland to represent our Python community and startup scene
at the annual conference produced by the Python Software Foundation.
We were pitching MetaBrite
and our technology that captures receipts,
yielding receipt information to users and onsumer insights.
We use Python extensively—we've written 120,000 lines of Python code
for web services, web apps, machine learning, image processing, and …continue.
It is often said that people fear public speaking more than they fear death.
I certainly used to fear getting up in front of a crowd,
though not to the point of death.
Tonight I spoke about FlyingCloud
in front of more than 100 people for half an hour
at the PuPPy Meetup.
I wasn't nervous beforehand and I wasn't nervous talking to the crowd.
I've been an active Toastmaster for nearly 15 years
and I've spoken at Toastmasters hundreds of times.
I'm used to a room of 15–25 people but not to a larger audience.
Adam and I put our slides together late last week.
We ran through it together …continue.
I just announced the release of FlyingCloud 0.3.0
on the flyingcloud-users mailing list.
I'll have more to say about FlyingCloud in future.
For now, let's just say it's a tool that we use to build
Docker images using masterless SaltStack.
I'll be speaking about FlyingCloud at Wednesday's PuPPy meetup.
Previous »
« Next