No `PyObject *foo;` is just a pointer to the struct. Declaring it does not say anything about whether or not you need to decref it. That depends on what you use it for, instantiating the python object is your `PyUString_FromString(...)`, and it gives you a reference and increases the reference count, so you *own* it. On the other hand, if you do `foo = other_object`, you *borrow* it, since you do not increase the reference count.

So whenever you assign a value to it, you need to be clear whether you *borrow* the reference, or you *own* it. And your pointer *owns* a reference, then it must decref it. Most of the time you will *own* the reference, so you need to decref. For example args/keyword args though are only borrowed. Sometimes the reference is also *stolen* if you use it as a function argument, meaning that you do not have to decref yourself.