[Python-ideas] Short form for keyword arguments and dicts
Anders Hovmöller
boxed at killingar.net
Wed Jun 26 17:51:19 CEST 2013
The *locals(...) thing looks pretty nice and would clearly take away a lot of the pain I was talking about! Thanks
> On 26 Jun 2013, at 16:46, Joshua Landau <joshua.landau.ws at gmail.com> wrote:
>
>> On 26 June 2013 09:04, Ethan Furman <ethan at stoneleaf.us> wrote:
>>> On 06/26/2013 12:48 AM, Greg Ewing wrote:
>>>
>>> Ron Adam wrote:
>>>>
>>>> And I don't like the '=' with nothing on the right.
>>>
>>>
>>> Expanding on the suggestion someone made of having a
>>> single marker of some kind in the argument list, I
>>> came up with this:
>>>
>>> def __init__(self, text, font = system_font, style = 'plain'):
>>> default_size = calc_button_size(text, font, style)
>>> Widget.__init__(self, size = default_size, pass font, style)
>>
>>
>> I don't care for it.
>>
>> A word doesn't stand out like a character does, plus this usage of pass is
>> completely different from its normal usage.
>>
>> We're already used to interpreting '*' as a coin with two sides, let's stick
>> with it:
>>
>> def apply_map(map, target, *, frobble): # '*' means frobble is keyword
>> only
>> ...
>>
>> and later:
>>
>> frobble = some_funny_stuff_here()
>> .
>> .
>> .
>> apply_map(map=kansas, target=toto, *, frobble) # '*' means frobble maps
>> to keyword frobble
>
> Whilst Greg Ewing has made me also much more sympathetic to this view,
> I feel that:
>
> 1) This is nearly unreadable - it does not say what it does in the slightest
>
> 2) It's added syntax - that's a high barrier. I'm not convinced it's
> worth it yet.
>
> 3) It still feels like hackery; I might prefer something explicitly
> hackery like this:
>
> apply_map(map=kansas, target=toto, **locals("frobble"))
>
> where locals is:
>
> def locals(*args):
> if args:
> return {arg:original_locals()[arg] for arg in args}
> else:
> return original_locals()
>
> For Greg's he'd use:
>
> def __init__(self, text="Hello", font=system_font, **kwds):
> default_size = calc_default_size(text, font)
> Widget.__init__(self, size=default_size, **locals("font"), **kwds)
>
> or even
>
> def __init__(self, text = "Hello", font = system_font, **kwds):
> default_size = calc_default_size(text, font)
> Widget.__init__(self, **locals("size", "font"), **kwds)
>
> under the asumption that http://bugs.python.org/issue2292 does get
> implemented first.
>
> For reference, he is using (respaced for consistency):
>
> def __init__(self, text="Hello", font=system_font, **kwds):
> default_size = calc_default_size(text, font)
> Widget.__init__(self, size=default_size, font=font, **kwds)
>
> Note that this is only a way to suggest that *there might be another
> way*; maybe something involving objects.
>
> 3 cont.) The reason I think it feels like hackery is simply that I
> don't feel like Python is ever "reference by name"; objects don't know
> what they are called (some know what they *were* named; but they have
> no guarantee it's true) it feels *very wrong* to give "foobar" to
> function and have that function somehow extract the name! I know it's
> not doing that, but it's ever-so-close.
>
> However; maybe:
>
> class AttrDict(dict):
> def __init__(self, mapping, **defaults):
> super().__init__(defaults, **mapping)
> self.__dict__ = self
>
> def __init__(self, **kwds):
> kwds = AttrDict(kwds, text="Hello", font=system_font)
>
> kwds.size = calc_default_size(kwds.text, kwds,font)
>
> Widget.__init__(self, **kwds)
>
> and a decorator could even make this:
>
> @dynamic_kwds(text="Hello", font=system_font)
> def __init__(self, kwds):
> kwds.size = calc_default_size(kwds.text, kwds,font)
> Widget.__init__(self, **kwds)
>
> which would have the same run-time effect as the original (the second
> keeps re-evaluating the signature).
>
>
> Again; I mention these only to show people not to have a restricted
> idea on what the solution looks like - don't just try and fix the
> symptoms of the problem.
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> http://mail.python.org/mailman/listinfo/python-ideas
More information about the Python-ideas
mailing list