On Thu, Nov 26, 2020 at 02:15:50PM -0500, nate lust wrote:
It would be convenient if you could mark in source code that you intended a resource to be "moved" and any further access through other bindings are not what was intended. This would help catch logic bugs during type checking, instead of hitting this issue at runtime.
I can't help but feel that if your code relies on the concept of "moving" an object, your concept is already at odds with Python's object and execution model. But putting that aside, is this is even technically possible? Can type checkers track the "owner" of a resource in this way? obj = {} # obj is owned by this code block process(obj) # still owned by this block print(obj) # so this is okay capture(obj) # but now ownership is stolen by capture() print(obj) # and this is a type-error (?!) Maybe I'm just not familiar enough with the type-checking state of art, but I would be amazed if this was possible. By the way, I have intentionally used the term "stolen" rather than "taken" or "transfered to" with respect to moving ownership of `obj`. At the caller's site, there is no obvious difference between the calls to process() which doesn't move obj, and capture() which does. Any innocuous-looking function could "move" ownership, with *or without* the knowledge of the caller. It's true that the Python interpreter itself has no concept of "ownership" in this sense, but to the degree that the coder cares about such ownership, having it moved without their knowledge and consent is surely "theft" :-) -- Steve