[Python-ideas] 'Injecting' objects as function-local constants

Jan Kaliszewski zuo at chopin.edu.pl
Tue Jun 14 12:17:55 CEST 2011


Bruce Leban dixit (2011-06-13, 18:45):

> It seems to me this discussion is mixing some different issues.
> 
> (1) having secret parameters that don't show in help().
[...]
> I think these should be thought about separately.
> 
> *For secret parameters:* help() could have a convention that it doesn't
> display variables with that start with _ or something like that, but that

No, the idea is that after-**-constans are not only hidden-in-help-
-arguments but that they also cannot be specified/overriden in a
function call. So their usage would not be a hack that causes risk of
incidental override by caller or that makes function signatures
obfuscated (they would have to be defined separately, after **|**kwargs,
in the righmost signature part).

    def compute(num1, num2, **, MAX_CACHE_LEN=100, cache=dict()):
        try:
            return cache[(num1, num2)]
        except KeyError:
            if len(cache) >= MAX_CACHE_LEN:
                cache.popitem()
            cache[(num1, num2)] = result = _compute(num1, num2)
            return result

    help(compute)                   # -> "... compute(num1, num2)"
    compute(1, 2)                   # OK
    compute(1, 2, MAX_CACHE_LEN=3)  # would raise TypeError
    compute(1, 2, cache={})         # would raise TypeError

----

Open question:

It's obvious that such a repetition must be prohibited (SyntaxError, at
compile time):

    def sth(my_var, **, my_var): "do something"

But in case of:

    def sth(*args, **kwargs, my_var='foo'): "do something"

-- should 'my_var' in kwargs be allowed? (it's a runtime question)
There is no real conflict here, so at the first sight I'd say: yes. 

Regards.
*j




More information about the Python-ideas mailing list