https://alpha.app.net/riyad/post/12202500
Tag: Programming
Summing Booleans For Fun And Profit
I came up with a IMHO nice piece of code while working with and getting to know Python.
incomplete_items = [
item.quantity_ordered > item.quantity_delivered for item in order.items
]
if any(incomplete_items):
do_something()
This feels clean and obvious. It might not be very efficient though. :/
has_incomplete_items = sum(
item.quantity_ordered > item.quantity_delivered for item in order.items
)
if has_incomplete_items:
do_something()
Doing it this way can be more efficient, since it can leverage generators and doesn’t need to go through the list again with
any
. But using
sum
over booleans feels hackish and non-obvious … 🙁
MagicMock With Spec
Thanks to @immoralist I’ve learned a new Python testing trick. I didn’t know about the “spec” argument for MagicMock. m(
Let’s see an example:
from mock import MagicMock
class SomeModel(object):
foo = "f**"
bar = "b**"
m = MagicMock(spec=SomeModel)
Here we create a mock object which mimics the interface of
SomeModel
as we would expect, returning mock values for things we access.
>>> m.foo <MagicMock name='mock.foo' id='4506756880'> >>> m.bar <MagicMock name='mock.bar' id='4506754192'>
Let’s see what happens if we call something else:
>>> m.baz
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File ".../env/lib/python2.7/site-packages/mock.py", line 658, in __getattr__
raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute 'baz'
It will fail loudly while a mock object without a spec would have returned a mock value as it did in the previous example.
But the magic doesn’t end there. You can still set additional attributes/methods “by hand” and have them not fail even if they aren’t part of the original spec.
>>> m.baz = "bazzzzz" >>> m.baz 'bazzzzz'
Learning new things makes me happy. 😀
Tripping Over Property Setters in Python
In Python there is a simple way to make methods behave like properties using the @property decorator. But this only covers the getter side of things. What if you want to have a setter function for this “property”? Well there is a way. 🙂
Consider the following example:
import json
class SomeModel(object):
_foo = '{"foo":["bar", "baz"]}'
@property
def foo(self):
return json.loads(self._foo)
@foo.setter
def foo_setter(self, new_value):
self._foo = json.dumps(new_value)
m = SomeModel()
Now you can use the
foo()
method like a property.
>>> m.foo
{u'foo': [u'bar', u'baz']}
This is a simple way to have a property contain a JSON string but access it as a Python dict, doing (de-)serialization on the fly.
So what if you want to set the value using a dict?
>>> m.foo = ["foo", "bar"] Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: can't set attribute
This is can easily trip up even seasoned Python developers. I’ve read code that did exactly this and I (as a novice) had to find out why the code failed. m(
The solution is quite simple … but “non-obvious” (as in: I wouldn’t have thought of that without consulting the docs) 🙁
@foo.setter
def foo(self, new_value)
self._foo = json.dumps(new_value)
Notice the method name? The setter and the getter methods have to have the same name!
API Response Fail
If you must use XML in your APIs … OK, I can handle that. But if your responses look like this … I hate you!

WHY?!?!
ADN: Lonely Coder in the Rain
https://alpha.app.net/riyad/post/9406239
Transforming Code into Beautiful, Idiomatic Python
Raymond Hettinger gives a great, concise and immediately useful examples of idiomatic Python.
Reporting 1.2k crashes
Interesting proposition: how do you report 1.2k crashes at once?
Many Tamagotchis Were Harmed in the Making of this Presentation
One of the less serious, but still very interesting (and insightful) talks from 29c3.
Convert any file VLC can play to mp3
I just felt the need for a script that could extract the audio track of a video, transcode it and save it as an mp3 file … 2 hours later I was finished (get the Gist). 😀 It uses VLC to do hard work. 😉
Thanks to Kris Hom for the inspiration. 🙂
Update 2014-03-01:
- Check whether VLC is installed
- Should also work on Linux now
- Increase default bit rate to 192kbit/s
- Fixed bug where the file/playlist would repeat endlessly
Update 2014-11-05:
- Also look for VLC in “~/Application/”
Update 2016-03-05
- Added a ffmpeg version