Python’s pickle (I’m talking standard Python 2.5/2.6/2.7 here) cannot pickle locks, file objects etc.
It also cannot pickle generators and lambda expressions (or any other anonymous code), because the pickle really only stores name references.
In case of locks and OS-dependent features, the reason why you cannot pickle them is obvious and makes sense.
But why can’t you pickle generators?
Note: just for clarity — I’m interested in the fundamental reason (or assumptions and choices that went into that design decision) why, not in “because it gives you a Pickle error”.
I realize the question’s a bit wide-aimed, so here’s a rule of thumb of whether your answered it: “If these assumptions were raised, or the type of allowed generator somehow more restricted, would pickling generators work again?”
There is lots of information about this available. For the "official word" on the issue, read the (closed) Python bugtracker issue.
The core reasoning, by one of the people who made the decision, is detailed on this blog:
And two suggested workarounds are mentioned: