Browse Source

Add more skeleton to post.

master
Ben Kurtovic 9 years ago
parent
commit
022b2ed53c
1 changed files with 21 additions and 18 deletions
  1. +21
    -18
      _drafts/python-object-replacement.md

+ 21
- 18
_drafts/python-object-replacement.md View File

@@ -9,6 +9,18 @@ draft: true
Today, we're going to demonstrate a fairly evil thing in Python, which I call Today, we're going to demonstrate a fairly evil thing in Python, which I call
_object replacement_. _object replacement_.


Say you have some program that's been running for a while, and a particular
object has made its way throughout your code. It lives inside lists, class
attributes, maybe even inside some closures. You want to completely replace
this object with another one; that is to say, you want to find all references
to object `A` and replace them with object `B`, enabling `A` to be garbage
collected.

_But why on Earth would you want to do that?_ you ask. I'll focus on a concrete
use case in a future post, but for now, I imagine this could be useful in some
kind of advanted unit testing situation with mock objects. Still, it's fairly
insane, so let's leave it as primarily an intellectual exercise.

## Review ## Review


First, a recap on terminology here. You can skip this section if you know First, a recap on terminology here. You can skip this section if you know
@@ -66,21 +78,7 @@ and you would never do that in practice). As a result, if you delete one of
these references—explicitly with `del a`, or implicitly if a name goes out of these references—explicitly with `del a`, or implicitly if a name goes out of
scope—then the other references are still around, and object continues to scope—then the other references are still around, and object continues to
exist. If all of an object's references disappear, then Python's garbage exist. If all of an object's references disappear, then Python's garbage
collector will eliminate it.

## The task

Say you have some program that's been running for a while, and a particular
object has made its way throughout your code. It lives inside lists, class
attributes, maybe even inside some closures. You want to completely replace
this object with another one; that is to say, you want to find all references
to object `A` and replace them with object `B`, enabling `A` to be garbage
collected.

_But why on Earth would you want to do that?_ you ask. I'll focus on a concrete
use case in a future post, but for now, I imagine this could be useful in some
kind of advanted unit testing situation with mock objects. Still, it's fairly
insane, so let's leave it as primarily an intellectual exercise.
collector should eliminate it.


## Fishing for references with Guppy ## Fishing for references with Guppy


@@ -94,16 +92,21 @@ dicts, class attributes via `__dict__`, locals()


### Lists ### Lists


....
simple replacement


### Tuples ### Tuples


recursively replace parent since immutable recursively replace parent since immutable


### Bound methods

note that built-in methods and regular methods have different underlying C
structs, but have the same offsets for their self field

### Closure cells ### Closure cells


function closures function closures


### Bound methods
### Frames


bound built-in methods separately?
...

Loading…
Cancel
Save