On 11/16/2016 12:36 AM, Steven D'Aprano wrote:

But, for what its worth...

I have a function, let's call it quartile(data, n). Unfortunately there's about
a dozen different ways to calculate quartiles, and they all give ever-so-
slightly different results. So I end up with:

def quartile(data, n, scheme="Method 7"):
     ...


which lets the caller choose the specific calculation method they want to use,
or just use the default. *My* default, chosen by me, which may or may not be
convenient.

And then there's a bunch of other functions which depend on quartile(). I don't
have to list them, but there's at least two and may be more. They too will have
an optional parameter to choose a calculation method. And *that* almost rules
out your factory function idea: having to call a factory to create multiple
functions is too confusing for a library API.

     quartile, iqr, blah blah blah = library.make_functions()


So while I'd consider that under some circumstances, I don't like it here.

I'd like the caller to be able to set their own default, if they don't like
mine, in the easiest way possible. That means a global.

DEFAULT_SCHEME = "Method 7"

# Late binding of the default, instead of early binding.
def quartile(data, n, scheme=None):
     if scheme is None:
         scheme = DEFAULT_SCHEME
     ...


Say they want to match the same calculation method that Excel uses, they can
just modify the library.DEFAULT_SCHEME and forget all about it.

But that's globally global, and I actually want it to only be global to their
own module. Hence my question.

I think you stuck with the same solution Decimal uses: a context that you can 
either set globally global, or one that can be used as a context manager.

--
~Ethan~
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to