Refactoring is inevitable in any sufficiently complex piece of software.<p>Type system in Java, C++ or C# helps the process immensely. Automated tooling can do most of the heavy lifting there.<p>In Python type hints are optional. Additionally, many libraries are written such that typing is hard (example: Flask's g object, or SQLAlchemy's models).<p>How to anticipate refactoring in Python and write code that is easy to refactor?<p>Things that worked well so far:<p>- verbose names. Longer variable or function name is less likely to collide with others within a project. Helps to quickly find all places in the project where the variable or function is used.<p>- ending variable names with _type. Example: `current_user`. Searching for `user.last_login_date` will surface `current_user.last_login_date` too.
Automated tests.<p>The books by Harry Percival on this are good.<p><a href="https://www.obeythetestinggoat.com/" rel="nofollow">https://www.obeythetestinggoat.com/</a>
Big fan of the two you mentioned. A couple more to add would be:<p>- Use black to format your code. No exceptions.<p>- Very modular code.<p>- Tests, although this costs time of course. Focus on meaningful rather than trivial ones if needed.<p>- Write comments explaining reasoning for particularly dense pieces of logic.<p>If you practice most of the above, hard to see where you can go wrong.