Not quite.
https://docs.python.org/3/reference/datamodel.html#object.__...
> It is not guaranteed that __del__() methods are called for objects that still exist when the interpreter exits.
With `with`I can't eg. pass an open file to another function to eg. be closed there etc.
Example:
https://play.rust-lang.org/?version=stable&mode=debug&editio...
closing `File` will happen at the end of `foo` or `foo2`.
That's true, since Python has reflection it can't easily optimize that case, whereas that's a powerful benefit of having a linear type system for tracking ownership like Swift or Rust. But early freeing (which Rust has and Python does not) is slightly different from deterministic freeing (which both have) is slightly different from guaranteed freeing (which CPython has and Rust does not).
Edit: Oh, and if you don’t think that’s enough, note that Rust doesn’t guarantee destruction to ever occur in that case (“considered safe”): https://doc.rust-lang.org/book/ch15-06-reference-cycles.html