Constant modules are modules that often contains variables that you want to use in many places without relying on hard coded values. Sometime you store paths (often relatives).
Is it a good thing to use pathlib.Path()
object is modules dedicated to constant?
Or is there anything that you should know before choosing to do so?
I would say the same question appears for using re.compile()
in constants.
Any advise?
Sounds fine, they’re both immutable which helps.
I do that all the time.
If it’s a path, you should use
Path
. If it’s a regular expression, define it as such withre.compile()
. If the purpose of such a module is to reduce boilerplate, then defining these values as strings only necessitates boilerplate later on to convert them.There’s one edge case to consider, though it’s very “edge”. If you define a very long/complex regex as a constant and then import from that file, Python will run
.compile()
on import. If you’re not actually using that regex though (say you imported the file to use a different value) then you’re burning CPU there for no reason.I generally don’t recommend that you concern yourself with that sort of thing though until you run into real performance problems. Most regexes you compile take no time at all, and the benefit of storing everything as the object you’d expect has big benefits for developer cognitive load.
Thanks a lot for the detailed answer.
@danielquinn agreed! You can work around the performance issues by wrapping it in a function.
I don’t see why not. However I like to have my constants module contain data structures as simple as possible, therefore I would prefer strings (which are also immutable), and create a Path object when I need it. I can see though that you usually won’t have the case where you would not want the path to be a Path object.
Why not?
That was my question. :)