A python module for global parameters - is this good practice?
I'm a mechanical engineering student, and I'm building a physical simulation using PyODE.
instead of running everything from one file, I wanted to organize stuff in modules so I had:
- main.py
- callback.py
- helper.py
I ran into problems when I realized that helper.py needed to reference variables from main, but main was the one importing helper!
so my solution was to create a 4th file, which houses variables and imports only external modules (such as time and random).
开发者_开发技巧so I now have:
- main.py
- callback.py
- helper.py
- parameters.py
and all scripts have: import parameters
and use: parameters.foo
or parameters.bar
.
Is this an acceptable practice or is this a sure fire way to make python programmers puke? :)
Please let me know if this makes sense, or if there is a more sensible way of doing it!
Thanks, -Leav
Separate 'global' files for constants, configurations, and includes needed everywhere are fine. But when they contain actual mutable variables then they're not such a good idea. Consider having the files communicate with function return values and arguments instead. This promotes encapsulation and will keep your code from becoming a tangled mess.
Clear communication between files makes them easier to understand and makes what's going on more obvious. When you're using variables and nobody knows where they came from, things can get pretty annoying. :)
Uhm, i think it does not make sence if this happens: "realized that helper.py needed to reference variables from main", your helper functions should be independent from your "main code", otherwise i think its ugly and more like a design failure.
I try to design my code so that it looks much like a pyramid. That, I have found, leads to cleaner code.
I'm not too sure about if that's good practice but if you use classes, I don't see why there should be a problem. Or am I missing something?
If you want to be able to just run each script independently too, and that's what is keeping you from going object oriented then you could do something like the following at the end of your script.
if __name__ == '__main__':
# Code that you want to run when the script is executed.
# This block will not be executed if the script is imported.
Read more about classes in Python here.
You should probably read up on Dependency Inversion.
Seems like what you want is to organize various dependencies between components. You will be better off expressing these dependencies in an object-oriented manner. Rather than doing it by importing modules and global states, encode these states in objects and pass those around.
Read up on objects and classes and how to write them in Python; I'd probably start there.
精彩评论