What's the difference?
An object pointer (created by
Pointer.make_from) points to the actual Python object (
PyObject*), while a variable pointer points to that actual variable.
hello = "123" ptr = to_ptr(hello) # ptr now points to "123", not "hello"
You can make a variable pointer through
from pointers import to_var_ptr a = "hi" ptr = to_var_ptr(a)
Note that of course you can't use a literal, because that isn't a variable:
from pointers import to_var_ptr ptr = to_var_ptr(123) # ValueError
Moving is much different when it comes to variable pointers. With an object pointer, you are overwriting that actual value, while with variable pointers you are just changing the value of that variable.
You can use movement the same way you would with an object pointer:
from pointers import to_var_ptr my_var = 1 my_ptr = to_var_ptr(my_var) my_ptr <<= 2 print(my_var, 1) # outputs 2 1, since we didnt overwrite 1 like we would with object pointers
You are free to use movement however you like with variable pointers. It isn't dangerous, unlike its counterpart.
For C/C++ developers
Movement in variable pointers is equivalent to the following C code:
int my_var = 1; // "my_var = 1" int my_ptr = &my_var; // "my_ptr = to_var_ptr(my_var)" *my_ptr = 2; // "my_ptr <<= 2" // my_var is now 2 (the actual 1 is unchanged, thankfully)
Assignment works the same way as it does with object pointers:
from pointers import to_var_ptr, NULL hello = "world" foo = "bar" ptr = to_var_ptr(hello) print(*ptr) # world ptr >>= NULL # ... ptr >>= foo print(*ptr) # bar