Right now I have one function that would be useful in a number of distinct packages that I work on. The function is only a handful of lines. But I would like to be able to use this code in a number of packages/projects that I work on and are deployed, I would like this code to be version controlled etc. There isn't, for example, one package that all the other packages already have as a requirement, otherwise I could put this code inside of that one and import it that way.
During my time coding I've come across this issue a couple times. For concreteness some functions f that have this characteristic might be:
- A wrapper or context manager which times a block of code with some log statements
- A function which divides a range of integers into as small number of evenly spaced strides while not exceeding a maximum number of steps
- A function which converts a center value and a span into a lower and upper limit
Basically the options I see are:
- Put the code
fin one of the existing packagesRand then make any packageAthat wants to usefhaveRas a requirement. The downside here is thatAmay require nothing fromRother thanfin which case most of the requirement is wasteful. - Copy the code
finto every packageAthat requires it. One question that comes up is then where shouldflive withinA? Because the functionality offis really outside the scope of packageAdoes. This is sort of a minor problem, the bigger problem is that if an improvement is made tofin one package it would be challenging to maintain uniformity across multiple packages that havefin them. - I could make an entire package
Fdedicated to functions likefand import it into each package that needsf. This seems like technically the best approach from a requirements management and separation of responsibility management perspective. But like I said, right now this would be an entire package dedicated to literally one function with a few lines of code. - If there is a stdlib function that has the functionality I want I should definitely use that. If there is not, I may be able to find a 3rd party package that has the functionality I want, but this brings about a zoo of other potential problems that I'd prefer to avoid.
What would be the suggested way to do this? Are there other approaches I haven't mentioned?
The entire packaging system is designed to solve exactly this problem - sharing code between different applications. So yes, the ideally you'd want to create a package out of this and add it as a dependency to all the other packages that use this code. There are a few upsides to this option:
f2,f3, etc. can potentially be added to this package, allowing you to share them across packages tooBut this also comes with some (potential) downsides:
Having said that, the option of copying code to each of the packages that use
fis still an option. Consider these points:Acould be using updated code, while packageBcould be using the older one. Regardless, whatever approach you use, you'd still need to update every package to maintain uniformity - for example if you go with a dedicated package, you'd still need to update the version used everywhere.fdoes something very specific, it can reside in an appropriately named file of its own. If nothing else, there is always the notoriously overusedutil.py¯\(ツ)/¯Recommendation
fis being propagated to all other packages every time, then putfin a package of its own and replace the code in the other packages with an import from this new package.PS: Someone may recommend using a git submodule for sharing this code - DO NOT do it, managing versions isn't clean and will soon get out of hand - you'd rather just create a new package instead